为什么"find.-name*.txt | xargs du -hc"会给出多个总数?

9 gnu filesize find du

我有一大堆目录,我正在尝试计算几百个.txt文件的总和大小.我试过这个,主要是有效的:

find . -name *.txt | xargs du -hc
Run Code Online (Sandbox Code Playgroud)

但是,不是在最后给我一个,我得到几个.我的猜测是,管道一次只能传递如此多的查找输出行,而du只是在每个批处理中运行.有没有解决的办法?

谢谢!亚历克斯

Sbo*_*odd 12

使用--files0-from选项到du怎么样?您必须适当地生成以null结尾的文件输出:

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-
Run Code Online (Sandbox Code Playgroud)

在我的系统上正常工作.

  • 啊,这对我有用,但我使用find的-print0而不是exec echo的东西. (3认同)

Omn*_*ity 7

find . -print0 -iname '*.txt' | du --files0-from=-
Run Code Online (Sandbox Code Playgroud)

如果你想有几个不同的扩展来搜索它是最好的:

find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
Run Code Online (Sandbox Code Playgroud)


RHS*_*ger 5

xargs程序将事情分解为批次,以考虑由于unix命令行的最大长度而产生的限制.它仍然比一次运行一个子命令更有效,但是,对于一长串输入,它将运行命令足够多次,每次"运行"足够短,不会导致问题.

因此,您可能会看到xargs需要运行的每个"批处理"的一个输出行.

因为您可能会发现它有用/有趣,所以可以在此处找到该手册页:http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs


另一件需要注意的事情(这可能是你帖子中的拼写错误或我的误解)是你的"*.txt"未转义/引用.即,你有

find . -name *.txt | xargs du -hc
Run Code Online (Sandbox Code Playgroud)

你可能想要的地方

find . -name \*.txt | xargs du -hc
Run Code Online (Sandbox Code Playgroud)

不同之处在于命令行可能会将*扩展到与...匹配的文件名列表中,而不是将*传递给find,后者将其用作模式.