Как получить размер файла в BASH с читаемым размером, а не в байтах

Как получить размер файла в BASH с читаемым размером, а не в байтах

Вот что у меня в файле оболочки:

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

Подскажите, пожалуйста, почему я не могу увидеть размер файла в читаемом виде?

Похоже, $FILESIZEINGB не установлен, и я не вижу результата в echoвыводе.

решение1

Вы не можете установить переменную оболочки из дочернего процесса, поэтому установка FILESIZEINGBв любом случае не сработает (и она не сработает, потому что это означает что-то другое в awkсинтаксисе).

Просто используйте du -h:

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

Также:

  • После . пробела быть не должно =.

решение2

Или, если вы не хотите использовать du:

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

решение3

Я нашел, что кто-то сделал однострочник на AWK, и в нем была ошибка, но я ее исправил. Я также добавил петабайты после терабайтов.

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] }')

Учитывая, statчто не на каждой системе, я бы использовал решение AWK. Пример; Raspberry Pi не имеет, statно имеет awk.

Связанный контент