这是我在 MacOS 中获取文件大小的方法:
$ du -h "Anthem - Rush (Cover by Jewel Box).webm"
69M Anthem - Rush (Cover by Jewel Box).webm
我想要的只是69M在输出中。圣歌 - Rush(由 Jewel Box 封面).webm被省略。怎么做?
答案1
du
报告文件的d
isk u
sage,而不是它们的(表观)大小。
文件的大小可以通过ls
其-l
//选项(以及其他信息)或通过具有不同且不兼容语法的实用程序的各种实现-o
或通过其.-g
-n
stat
find
-printf '%s\n'
GNU 实现du
还可以--apparent-size
返回大小而不是磁盘使用情况,但是不能用于目录,因为对于这些类型的文件,du
总是添加其中引用的所有文件的磁盘使用情况/大小。
因此,要在 GNU 系统上获取符号链接解析后带有 KMGTPE 后缀的文件的大小,我会这样做:
stat -Lc%s -- "$file" | numfmt --to=iec
答案2
只需保留第一个字段即可。您可以通过多种方式执行此操作:
切
du -h "Anthem - Rush (Cover by Jewel Box).webm" | cut -f1
awk
du -h "Anthem - Rush (Cover by Jewel Box).webm" | awk '{print $1}'
sed
du -h "Anthem - Rush (Cover by Jewel Box).webm" | sed 's/[[:blank:]].*//'
珀尔
du -h "Anthem - Rush (Cover by Jewel Box).webm" | perl -pe 's/\s.*//' du -h "Anthem - Rush (Cover by Jewel Box).webm" | perl -lane 'print $F[0]'
答案3
您可以使用示例awk
命令来执行您想要的操作:
du -h <filename>|awk '{print $1}'
答案4
为了稍微扩展一下 terdon 提取 du 输出的有用部分的各种方法,在我的一些脚本中,我需要使用程序输出的不同部分,但我不想多次运行该程序提取不同的字段。因此,我运行该程序一次并将其完整(原始、未过滤)输出捕获到一个变量中,然后使用 shell 变量扩展从该变量中提取我需要的每个字段。
例如,您可以这样做来记住完整的输出:
du_output_raw=$(du -h 'Anthem - Rush (Cover by Jewel Box).webm')
然后提取文件大小的第一个空格分隔字段:
f_size=${du_output_raw%% *)
文件的编码位于文件扩展名中,提取最后一个点之后的部分:
f_encoding=${du_output_raw##*.}
这是一个好例子,也是一个坏例子。这很好,因为我刚刚提取了由不同字符分隔的输出部分(一个使用空格,另一个使用“.”)。这很糟糕,因为我不会真正使用 du 输出来提取文件扩展名,我会使用另一个变量中已有的文件名。但这显示了总体思路。
我确信有人会指出,您可以记住数组变量中的输出,以便更自动地拆分为字段:
du_output=( $(du -h 'Anthem - Rush (Cover by Jewel Box).webm' )
或者(使用其他 shell 中可能没有的 bash 功能):
read -a du_output < <(du -h 'Anthem - Rush (Cover by Jewel Box).webm')
然后使用带有有用信息的数组元素:
f_size="${du_output[0]}"
f_encoding=${du_output[-1]##*.}