Trebuie să convertiți octeți în GB,MB,KB în format zecimal normal (Unix, Linux, Script Shell)

rampă a intrebat.
a intrebat.

Am dat codul de mai jos pentru a converti octetul în valorile corespunzătoare

for OUTPUT in $(find $IP_DIR -maxdepth 1 | awk 'NR>1')
do
    case $RETURNSIZE in
        "gb") FS=`du -b $OUTPUT | awk {'print $1'}`
              FS=`echo $FS | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }'`
              echo $OUTPUT "|" $FS;;
        "mb") FS=`du -b $OUTPUT | awk {'print $1'}`
              FS=`echo $FS | awk '{ byte =$1 /1024/1024 ; print byte " MB" }'`
              echo $OUTPUT "|" $FS;;
        "kb") FS=`du -b $OUTPUT | awk {'print $1'}`
              FS=`echo $FS | awk '{ byte =$1 /1024 ; print byte " KB" }'`
              echo $OUTPUT "|" $FS;;
        "b")  FS=`du -b $OUTPUT | awk {'print $1'}`
              echo $OUTPUT "|" $FS "B";;
    esac


OUTPUT

/home/work/exten.sh | 3.53903e-07 GB
/home/work/e.txt | 0 GB
/home/work/t.txt | 0 GB
/home/worktest | 9.53674e-07 GB
/home/work/s.txt | 3.23169e-07 GB

Logica pare să funcționeze perfect, dar când vine vorba de gb (RETURNSIZE), rezultatul este în format exponențial.

Dar eu caut rezultatul în format zecimal normal.

Comentarii

  • Deoarece ați etichetat întrebarea dvs. cu linux: ce este în neregulă cu du -Sh? –  > Por Satō Katsura.
  • @SatoKatsura Nu pot folosi acest indicator, deoarece cerința mea este să obțin ieșirea, adică dimensiunea în cifre reale. Iar steagul „-h” îmi oferă valorile rotunjite. –  > Por rampa.
  • Bine. Atunci ați putea seta OFMT. Sau folosiți printf() în loc de print. –  > Por Satō Katsura.
  • Rețineți că acest calcul al GB este metoda „Gigibyte” (modul în care se calculează memoria de sistem, toate 1024 nu 1000). Ca atare, „GB” de mai sus este o etichetă greșită și ar trebui să fie „GiB”. A se vedea hexus.net/tech/tech-explained/storage/… –  > Por Scott Prive.
5 răspunsuri
xenoid

Din moment ce este vorba de Linux, sunt surprins că nimeni nu a menționat numfmt comanda:

numfmt – Conversia numerelor din/în șiruri de caractere lizibile de către oameni

>>numfmt --to iec --format "%8.4f" 599511627776
558.3388G

Comentarii

  • exemplu pentru a converti prima coloană din stdout : echo -e "1024 1048576
    1048576 1024 " | numfmt --to iec
    –  > Por Indentare.
Peschke

Nu am testat, dar cred că are legătură cu faptul că ai încărcat bc mathlib cu bc -l.

Încearcă să schimbi awk piesa de calcul pentru GB în:

awk '{ byte =$1 /1024/1024/1024; print byte " GB" }'

Notă: 1024/1024**2 este echivalent cu 1024/1024/1024 în awk.

Comentarii

  • Îmi pare rău că din greșeală am lipit codul de traseu acolo mai devreme. Acum le-am editat. Am încercat această posibilitate chiar mai devreme. Obțineam în continuare valorile în formă exponențială. Împreună cu acest „1 GB = 1073741824 B = 1048576 MB” –  > Por rampă.
  • Acest lucru este frumos și îngrijit. Comentariul „GB vs „GiB” pe care l-am făcut în răspunsul acceptat, se aplică și aici. –  > Por Scott Prive.
Juan

De ce nu folosiți bc în loc de awk?ca:

$ a=2342341234534634653453452342
$ echo "scale=2; $a/1024/1024" | bc -l
2233830675634989407971.81

StefanKaerst
> echo -e "1GiB
MB" | units
Currency exchange rates from finance.yahoo.com on 2017-10-31 
3047 units, 109 prefixes, 109 nonlinear units

You have: You want:     * 1073.7418
        / 0.00093132257
You have:

sau

> echo $((1024*1024*1024))
1073741824
>   

om 7 unități

HTH

igonejack

A făcut un mic cli pentru acest lucru.

https://github.com/gonejack/hsize

> hsize 123 45678
123 => 123B
45678 => 44.61KB
> echo 19129219219129119 | hsize
19129219219129119 => 16.99PB