您正在寻找管道 ( |)。它们是连接多个命令并将一个命令的输出作为输入传递给另一个命令的一种方式。在这种情况下,您希望将找到的所有文件名作为输入传递给du(计算大小)。但是,因为du期望文件名和结果find只是一个文本列表(是的,文本由文件名组成,但du不知道,它看到的只是文本),你需要使用类似xargswhich will take each文本行,将其视为文件名并将其传递给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
您正在寻找管道 (
|
)。它们是连接多个命令并将一个命令的输出作为输入传递给另一个命令的一种方式。在这种情况下,您希望将找到的所有文件名作为输入传递给du
(计算大小)。但是,因为du
期望文件名和结果find
只是一个文本列表(是的,文本由文件名组成,但du
不知道,它看到的只是文本),你需要使用类似xargs
which will take each文本行,将其视为文件名并将其传递给du
. 将所有这些放在一起,我们得到:你应该总是引用你给的模式
find
(就像我在上面所做的那样:)"*.o"
。如果不这样做,shell 会将 扩展*.o
为当前目录中任何匹配文件的名称。它在这种情况下有效,只是因为您没有匹配的文件。的
-sch
标志du
记录在man du
:但是请注意,对于包含空格的文件名,这将失败。这几乎肯定不会成为目标文件的问题,但将来,如果您还需要处理空格,请使用:
make打印 NULL 分隔的行,而make
-print0
将这些行作为输入。find
-0
xargs
或者,您可以自己
find
打印尺寸,然后将它们相加:这也将解决@Serg 在评论中提到的问题,即参数太多并且命令被分解为单独的命令。
如果你正在使用
bash
(你可能是),有一个更简单的方法:该
shopt globstar
命令**
匹配所有文件和或更多子目录。启用后,**/*.o
将匹配名称以 . 结尾的所有文件(和目录).o
,因此我们可以将其直接传递给du
.请注意,与该
find
方法不同,这不会匹配隐藏文件(名称以 a 开头的文件.
)。要匹配这些,请执行以下操作:使用
-exec
标志来运行du
命令;
(每个文件的含义)样本输出:
find
是递归的——意味着它遍历所有子目录。如果您只想获取*.o
当前目录中所有文件的总数,只需执行使用 perl:
当前目录中所有非隐藏 PDF 文件的大小。