So erhalten Sie die Dateigröße in BASH mit lesbarer Größe, nicht in Bytes

So erhalten Sie die Dateigröße in BASH mit lesbarer Größe, nicht in Bytes

Folgendes habe ich in meiner Shell-Datei:

FILENAME=/var/lib/backups/html-backup/backup-15-04-2016.tar.gz;
FILESIZE= $(ls -lah $FILENAME | awk '{ $FILESIZEINGB = $5}')
echo "Size is $FILESIZEINGB ."

Können Sie mir bitte sagen, warum ich die Dateigröße nicht in lesbarer Form sehen kann?

Es scheint, dass $FILESIZEINGB nicht festgelegt ist und ich das Ergebnis nicht in der Ausgabe sehen kann echo.

Antwort1

Sie können eine Shell-Variable nicht von einem untergeordneten Prozess aus festlegen. Daher FILESIZEINGBwürde das Festlegen sowieso nicht funktionieren (und es würde nicht funktionieren, weil es in awkder Syntax etwas anderes bedeutet).

Benutz einfach du -h:

FILESIZEINGB=$(du -h "$FILENAME" | awk '{print $1}')

Auch:

  • Nach sollte kein Leerzeichen stehen =.

Antwort2

Oder wenn Sie nicht verwenden möchten du:

FILESIZE=$(ls -lah $FILENAME | awk '{ print $5}')
echo "Filesize is $FILESIZE"

Antwort3

Ich habe herausgefunden, dass jemand einen AWK-Einzeiler geschrieben hat. Der hatte einen Fehler, den ich aber behoben habe. Außerdem habe ich nach Terabyte auch Petabyte hinzugefügt.

FILE_SIZE=234234 # FILESIZE IN BYTES
FILE_SIZE=$(echo "${FILE_SIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')

Da states nicht auf jedem System vorhanden ist, würde ich die AWK-Lösung verwenden. Beispiel: Der Raspberry Pi hat nicht, stataber er hat awk.

verwandte Informationen