将文件和目录列表通过管道传送到 du 仅显示目录的大小?

将文件和目录列表通过管道传送到 du 仅显示目录的大小?

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

1/a.txt
1/b.txt
2/c.txt
2/d.txt
3/e.txt
3/f.txt

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


我的毫无意义的练习

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

find . | xargs du

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


如果我使用:

find . | xargs du -a

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

这里发生了什么?

答案1

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

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

find . | xargs -n 1 du -a

答案2

我们可以使用下面的命令

  find path -type f -printf "%s %p\n"

答案3

您可以-exec在以下位置使用该函数find

find . -type f -exec du -h {} \;

相关内容