一次删除100个文件并计算总文件数

时间:2016-09-10 08:05:04

标签: linux bash

我编写了一个bash脚本,一次从一个目录中删除100个文件,因为我的 args列表太长了错误,但现在我想计算总共删除的文件总数目录

这是脚本

echo /example-dir/* | xargs -n 100 rm -rf

我想要的是将每个目录中已删除的文件总数写入文件以及路径,例如Deleted <count> files from <path>

我如何通过目前的设置实现这一目标?

3 个答案:

答案 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

使用GNU Parallel能够构建长参数列表

time find . -name \*.txt -print0 | parallel -0 -X rm -v | wc -l
   30000

real    0m1.076s
user    0m1.090s
sys     0m1.223s

使用单个Perl进程读取文件名并在计数时删除

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