如何格式化“du”输出以仅显示文件大小?

如何格式化“du”输出以仅显示文件大小?

这是我在 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报告文件的disk usage,而不是它们的(表观)大小。

文件的大小可以通过ls-l//选项(以及其他信息)或通过具有不同且不兼容语法的实用程序的各种实现-o或通过其.-g-nstatfind-printf '%s\n'

GNU 实现du还可以--apparent-size返回大小而不是磁盘使用情况,但是不能用于目录,因为对于这些类型的文件,du总是添加其中引用的所有文件的磁盘使用情况/大小。

因此,要在 GNU 系统上获取符号链接解析后带有 KMGTPE 后缀的文件的大小,我会这样做:

stat -Lc%s -- "$file" | numfmt --to=iec

答案2

只需保留第一个字段即可。您可以通过多种方式执行此操作:

  1. du -h "Anthem - Rush (Cover by Jewel Box).webm" | cut -f1
    
  2. awk

    du -h "Anthem - Rush (Cover by Jewel Box).webm" | awk '{print $1}'
    
  3. sed

    du -h "Anthem - Rush (Cover by Jewel Box).webm" | sed 's/[[:blank:]].*//'
    
  4. 珀尔

    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]##*.}

相关内容