我有一组大量目录,我试图计算数百个.txt文件的总大小。 我尝试了这个方法,它大多有效:
find . -name *.txt | xargs du -hc
但是我得到的不是最终的总数,而是好几个结果。我猜测这是由于管道每次只传递find输出的有限行数,而du则对每批数据进行操作。有没有办法解决这个问题?
谢谢! Alex
我有一组大量目录,我试图计算数百个.txt文件的总大小。 我尝试了这个方法,它大多有效:
find . -name *.txt | xargs du -hc
但是我得到的不是最终的总数,而是好几个结果。我猜测这是由于管道每次只传递find输出的有限行数,而du则对每批数据进行操作。有没有办法解决这个问题?
谢谢! Alex
使用--files0-from选项来计算du的大小如何?您需要适当生成以空字符结尾的文件输出:
find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-
在我的系统上正常工作。
-print0
从技术上讲不是 posix
标准(因为不是所有命令都能处理以 $'\0'
结尾的文件,这个原因非常奇怪)。尽管如此,大多数实现似乎已经扩展了该选项。 - Reinstate Monica Pleasefind . -print0 -iname '*.txt' | du --files0-from=-
如果您想搜索多个不同的扩展名,最好这样做:
find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
-exec echo {}"=0";
更容易记住。等等,不对。嗯 -exec echo -n {}"\0" \;
。不行吗?-exec echo $#&@*#(@!@#$@#!!!
(好多了) - Stephen还有一件事需要注意(这可能是您的帖子中的笔误或我的误解),即您未对“*.txt”进行转义/引用。也就是说,您有:
find . -name *.txt | xargs du -hc
你可能想要的地方
find . -name \*.txt | xargs du -hc
另一个简单的解决方案:
find . -name *.txt -print0 | xargs -0 du -hc
for
循环:for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done
xargs将其输入分成合理大小的块 - 您看到的是每个块的总计。请查看xargs的man页面以了解如何配置其处理输入的方式。
find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'