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

时间:2009-08-24 17:29:31

标签: find gnu filesize du

我有一大堆目录,我正在尝试计算几百个.txt文件的总大小。我试过这个,大部分都有效:

find . -name *.txt | xargs du -hc

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

谢谢! 亚历

7 个答案:

答案 0 :(得分:11)

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

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-

在我的系统上正常工作。

答案 1 :(得分:7)

find . -print0 -iname '*.txt' | du --files0-from=-

如果您想要有几个不同的扩展程序来搜索它,那么最好:

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

答案 2 :(得分:5)

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

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

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


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

find . -name *.txt | xargs du -hc

你可能想要的地方

find . -name \*.txt | xargs du -hc

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

答案 3 :(得分:3)

另一个简单的解决方案:

find . -name *.txt -print0 | xargs -0 du -hc

答案 4 :(得分:1)

另一种解决方案是使用bash for循环:

for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done

当你需要更多地控制循环中发生的事情时,这很有用。

答案 5 :(得分:0)

xargs将其输入破坏为合理大小的块 - 你看到的是每个块的总数。查看xargs的手册页,了解如何配置其输入处理。

答案 6 :(得分:0)

另一种解决方案是使用awk:

find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'