我有一大堆目录,我正在尝试计算几百个.txt文件的总大小。我试过这个,大部分都有效:
find . -name *.txt | xargs du -hc
但是最后我没有给我一个总数,而是得到了几个。我的猜测是,管道一次只能传递如此多的查找输出行,而du只是在每个批处理中运行。有办法解决这个问题吗?
谢谢! 亚历
答案 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 }'