首页 > 解决方案 > 我可以使用 stat 来显示人类可读的文件大小吗?

问题描述

我正在尝试使用 stat 命令显示当前目录中的文件列表,按从大到小排序。我的脚本是

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

它可以工作,但是它以字节为单位显示大小。有没有办法使用 stat 以人类可读的格式显示它?还是我必须尝试别的东西。感谢您的帮助。

标签: bash

解决方案


据我所知,该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

推荐阅读