Могу ли я использовать stat, чтобы показать читабельный размер файла? - PullRequest
2 голосов
/ 14 февраля 2020

Я пытаюсь использовать команду stat для отображения списка файлов в текущем каталоге, отсортированного по величине к наименьшему. Мой скрипт

filelist=$(ls -p | grep -v/)
filesize=$(stat -c "%s : %n" $filelist | sort -nr)

Работает, однако отображает размер в байтах. Есть ли способ показать его в удобочитаемом формате, используя stat? или я должен попробовать что-то еще. спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2020

Насколько я знаю, программа stat сама по себе не может отображать читабельные размеры. Но вы всегда можете передать его другой программе, например, numfmt:

stat -c %s /path/to/file | numfmt --to=iec

Применительно к вашему примеру это будет:

filelist=$(ls -p | grep -v/)
filesize=$(
    stat -c "%s %n" $filelist | sort -nr -k1 | while read filesize filename; do
        printf '%s : %s\n' "$(numfmt --to=iec <<< $filesize)" "$filename"
    done
)

Обратите внимание, что я добавил опция -k1 при вызове sort, потому что я предполагаю, что вы хотите отсортировать, используя размер, а не имя.

numfmt имеет то преимущество, что вы можете выбрать способ отображения удобочитаемого размера. , Я предложил --to=iec, потому что это наиболее распространенный типоразмер файлов, но вы можете использовать другие преобразования. Пожалуйста, обратитесь к справочной странице numfmt .

В качестве последнего замечания я бы посоветовал вам не сохранять файлы непосредственно из захвата $(), поскольку он не будет работать, если имя файла содержит космический персонаж. Вы можете использовать find, чтобы вывести список файлов и получить размер одновременно, например:

find . -mindepth 1 -maxdepth 1 -not -type d -printf '%s %f\n' |
    sort -nr -k1 |
    while read filesize filename
do
    printf '%s : %s\n' "$(numfmt --to=iec <<< $filesize)" "$filename"
done
0 голосов
/ 14 февраля 2020

Но ls может сделать это:

ls --human-readable --kibibytes -Sl

Если вам не нужен полный вывод ls, можете использовать его с du:

for FILE in `ls -S`; do du -sh $FILE ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...