管道文件和目录列表到 du 只显示目录的大小?

phi*_*raj 6 pipe xargs disk-usage

假设我有一个包含多个子目录的目录,每个子目录都包含一些文件:

1/a.txt
1/b.txt
2/c.txt
2/d.txt
3/e.txt
3/f.txt
Run Code Online (Sandbox Code Playgroud)

我想查看每个文件的大小。请记住,我知道有更简单、更直接的方法可以做到这一点,例如du -a. 我只是想知道为什么以下不起作用,出于教育目的。


我毫无意义的运动

运行find .返回所有文件和目录的列表,所以我尝试像这样管道它:

find . | xargs du
Run Code Online (Sandbox Code Playgroud)

但这只是返回目录 1、2 和 3 的大小。我缺少一些理解,因为在我看来xargs应该将每一行输出映射find到对du.


如果我使用:

find . | xargs du -a
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作,列出所有文件和目录的大小。如果我只使用该-type f选项将文件列表传递给它,它也可以正常工作,因此它与接收与文件混合的目录列表有关。

这里发生了什么?

Tho*_*key 9

发生的事情是xargs将(如果可以的话)所有名称放在一个命令行上,因此您只能看到一个命令传递给du. 然后du忽略文件名(如您所料:文件是目录的一部分,它不会计算两次)。

如果您使用-n 1参数 to xargs,它将拆分命令,您将看到更多您期望的内容。

find . | xargs -n 1 du -a