我想知道我的主文件夹中带有 .o 扩展名(目标文件)的文件的大小。
我可以找到所有使用的目标文件
find . -name '*.o'
Run Code Online (Sandbox Code Playgroud)
我现在如何计算这些文件的总大小?
ter*_*don 28
您正在寻找管道 ( |
)。它们是一种连接多个命令并将一个命令的输出作为输入传递给另一个命令的方法。在这种情况下,您希望将找到的所有文件名作为输入传递给du
(计算大小)。然而,由于du
预期的文件名和结果find
都只是文字的列表(是的,文本包括文件名,但du
无法知道,所有它认为是文字),你需要使用类似xargs
将于每个文本行,将其视为文件名并将其传递给du
. 把所有这些放在一起,我们得到:
find . -name "*.o" | xargs du -sch
Run Code Online (Sandbox Code Playgroud)
你应该总是引用你给出的模式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
Run Code Online (Sandbox Code Playgroud)但是请注意,对于包含空格的文件名,这将失败。这几乎肯定不会成为目标文件的问题,但将来,如果您还需要处理空格,请使用:
find . -name "*.o" -print0 | xargs -0 du -sch
Run Code Online (Sandbox Code Playgroud)
该-print0
品牌find
打印NULL分隔线和-0
品牌xargs
采取这样的线作为输入。
或者,您可以find
打印尺寸本身,然后将它们相加:
find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'
Run Code Online (Sandbox Code Playgroud)
这也将解决@Serg 在注释中提到的问题,其中参数太多并且命令被分解为单独的命令。
如果您正在使用bash
(您可能正在使用),则有一种更简单的方法:
shopt -s globstar
du -sch **/*.o
Run Code Online (Sandbox Code Playgroud)
该shopt globstar
命令**
匹配所有文件和或多个子目录。启用后,**/*.o
将匹配名称以 . 结尾的所有文件(和目录).o
,因此我们可以将其直接传递给du
.
请注意,与该find
方法不同,这不会匹配隐藏文件(名称以 a 开头的文件.
)。要匹配这些,请执行以下操作:
shopt -s dotglob globstar
du -sch **/*.o
Run Code Online (Sandbox Code Playgroud)
使用-exec
标志来运行du
命令 ;
(意思是每个文件)
find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}'
Run Code Online (Sandbox Code Playgroud)
示例输出:
$ 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
Run Code Online (Sandbox Code Playgroud)
find
是递归的 - 意味着它遍历所有子目录。如果您只想获取*.o
当前目录中所有文件的总数,只需执行
du -b -c *.o
Run Code Online (Sandbox Code Playgroud)