为什么“找到。 -name * .TXT | xargs的杜-hc”给多个总计?(Why do

2019-07-03 14:27发布

我有一大套的,我正在努力计算出的几百.txt文件的总和尺寸目录。 我想这一点,这主要作品:

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

而是让我在最后一个总,我得到几个。 我的猜测是,该管道将只通过对发现的输出这么多线的时间,和du只是运行在每一批次,因为它涉及。 有没有解决的办法?

谢谢! 亚历克斯

Answer 1:

如何使用--files0,从选项杜? 你必须适当地产生空终止文件输出:

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

正常工作我的系统上。



Answer 2:

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

如果你想有几个不同的扩展搜索,最好的事情:

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


Answer 3:

该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

所不同的是,命令行可能会扩大到*匹配文件名列表...而不是传递到*发现,这将使用它作为一种模式。



Answer 4:

另一种简单的解决方案:

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


Answer 5:

一个替代的解决方案是使用bash for循环:

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

这是好事,因为当你需要的在循环会发生什么更多的控制。



Answer 6:

xargs的萧条其输入到合理大小的块 - 你看到的是为每个块的总数。 检查的方式来配置其输入为处理xargs的手册页。



Answer 7:

一个替代的解决方案是使用AWK:

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


文章来源: Why does “find . -name *.txt | xargs du -hc” give multiple totals?