我想知道主文件夹中扩展名为 .o 的文件(目标文件)的大小。
我可以使用以下方法找到所有目标文件
find . -name '*.o'
我现在如何计算这些文件的总大小?
答案1
您正在寻找管道(|
)。它们是连接多个命令并将一个命令的输出作为输入传递给另一个命令的一种方式。在本例中,您希望将找到的所有文件名作为输入传递给du
(计算大小)。但是,由于du
期望文件名并且的结果find
只是一个文本列表(是的,文本由文件名组成,但du
不知道这一点,它看到的只是文本),您需要使用类似的东西,xargs
它将获取每一行文本,将其视为文件名并将其传递给du
。把所有这些放在一起,我们得到:
find . -name "*.o" | xargs du -sch
你应该总是引用您提供的模式
find
(如我上面所做的:)"*.o"
。如果不这样做,shell 会将扩展*.o
为当前目录中任何匹配文件的名称。它在这种情况下起作用只是因为您没有匹配的文件。-sch
的标志记录du
在man 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打印-print0
以find
NULL 分隔的行,并且-0
makesxargs
将这些行作为输入。
或者,您可以先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