我编写了一个bash脚本,一次从一个目录中删除100个文件,因为我的 args列表太长了错误,但现在我想计算总共删除的文件总数目录
这是脚本
echo /example-dir/* | xargs -n 100 rm -rf
我想要的是将每个目录中已删除的文件总数写入文件以及路径,例如Deleted <count> files from <path>
我如何通过目前的设置实现这一目标?
答案 0 :(得分:3)
您可以通过启用rm
的详细输出,然后使用wc -l
如果文件名中包含空格或特殊字符,则使用echo
将文件列表传递给xargs
将无效。
最好使用find
与-print0
一起使用NULL字符作为单个文件的分隔符:
find /example-dir -type f -print0 | xargs --null -n 100 rm -vrf | wc -l
答案 1 :(得分:1)
您可以避免xargs
并在简单的while
循环中执行此操作并使用计数器:
destdir='/example-dir/'
count=0
while IFS= read -d '' file; do
rm -rf "$file"
((count++))
done < <(find "$destdir" -type f -print0)
echo "Deleted $count files from $destdir"
注意使用-print0
来处理带有空格/换行符/ glob等的文件名。
答案 2 :(得分:1)
顺便说一下,如果你真的有很多文件并经常这样做,那么看看其他一些选项可能会有用:
find
的内置-delete
time find . -name \*.txt -print -delete | wc -l
30000
real 0m1.244s
user 0m0.055s
sys 0m1.037s
find
构建最大长度参数列表time find . -name \*.txt -exec rm -v {} + | wc -l
30000
real 0m0.979s
user 0m0.043s
sys 0m0.920s
time find . -name \*.txt -print0 | parallel -0 -X rm -v | wc -l
30000
real 0m1.076s
user 0m1.090s
sys 0m1.223s
time find . -name \*.txt -print0 | perl -0ne 'unlink;$i++;END{print $i}'
30000
real 0m1.049s
user 0m0.057s
sys 0m1.006s
对于测试,您可以使用 GNU Parallel 快速创建30,000个文件,这允许-X
也构建长参数列表。例如,我可以在Mac上用8秒钟创建30,000个文件:
seq -w 0 29999 | parallel -X touch file{}.txt