目录树中特定扩展名的所有文件的大小

目录树中特定扩展名的所有文件的大小

我想知道主文件夹中扩展名为 .o 的文件(目标文件)的大小。

我可以使用以下方法找到所有目标文件

find . -name '*.o'

我现在如何计算这些文件的总大小?

答案1

您正在寻找管道(|)。它们是连接多个命令并将一个命令的输出作为输入传递给另一个命令的一种方式。在本例中,您希望将找到的所有文件名作为输入传递给du(计算大小)。但是,由于du期望文件名并且的结果find只是一个文本列表(是的,文本由文件名组成,但du不知道这一点,它看到的只是文本),您需要使用类似的东西,xargs它将获取每一行文本,将其视为文件名并将其传递给du。把所有这些放在一起,我们得到:

find . -name "*.o" | xargs du -sch
  • 你应该总是引用您提供的模式find(如我上面所做的:)"*.o"。如果不这样做,shell 会将扩展*.o为当前目录中任何匹配文件的名称。它在这种情况下起作用只是因为您没有匹配的文件。

  • -sch的标志记录duman du

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

但请注意,对于包含空格的文件名,此方法将失败。对于目标文件,这几乎肯定不会成为问题,但将来,如果您还需要处理空格,请使用:

find . -name "*.o" -print0 | xargs -0 du -sch

makes打印-print0findNULL 分隔的行,并且-0makesxargs将这些行作为输入。

或者,您可以先find打印尺寸本身,然后对它们求和:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

这也可以解决@Serg 提到的问题评论其中参数太多,命令被分解为单独的命令。


如果您正在使用bash(您可能正在使用),那么有一种更简单的方法:

shopt -s globstar 
du -sch **/*.o

shopt globstar命令**匹配所有文件和一个或多个子目录。启用后,**/*.o将匹配名称以 结尾的所有文件(和目录).o,因此我们可以将其直接传递给du

请注意,与该find方法不同,此方法不会匹配隐藏文件(名称以 开头的文件.)。要匹配这些文件,请执行以下操作:

shopt -s dotglob globstar
du -sch **/*.o

答案2

使用-exec 标志来运行du命令 ;(每个文件的含义)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

示例输出:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

find是递归的 - 意味着它会遍历所有子目录。如果你只想获取*.o当前目录中所有文件的总数,只需执行

du -b -c *.o

答案3

使用 perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

当前目录中所有非隐藏的 PDF 文件的大小。

答案4

解决方案:

find . -name "*.o" | xargs du -sch

如果文件名中有空格,则会失败。可以使用以下方法修复此问题:

find . -name "*.o" -print0 | xargs -0 du -sch

相关内容