linux 删除选中的文件,[20200414]Linux下快速删除大量文件(补充).txt

本文探讨了在Linux环境下,通过Perl、unlink、xargs和find命令删除文件的效率问题。实验结果显示,删除顺序对效率有显著影响,有序删除比无序删除更快。并行处理(如xargs -P)能提高删除速度,但sys资源消耗较大。同时,find命令的输出顺序混乱导致效率降低,通过排序输出可以显著提升性能。结论是,删除文件时,考虑删除顺序和并行处理可以有效优化效率。
摘要由CSDN通过智能技术生成

2.你可以发现perl的脚本实际上如下:

$ time perl -e 'unlink for ( )'

$ time perl -e 'for(){((stat)[9]

real    0m30.646s

user    0m1.365s

sys     0m8.623s

--//我测试环境。你可以发现perl实际上调用unlink。我发现unlink实际上是也是linux的一个命令。

$ man  unlink

UNLINK(1)                        User Commands                       UNLINK(1)

NAME

unlink - call the unlink function to remove the specified file

SYNOPSIS

unlink FILE

unlink OPTION

--//你可以发现它支持的参数几乎没有,很纯粹的就是一个删除操作。它的缺点是只能1个1个删除。

$ time ls -1 | xargs -IQ -P20 -r unlink Q

real    0m58.953s

user    0m6.860s

sys     0m49.183s

--//因为1个1个删除,你可以发现执行时间并不是很快,大约需要1分钟。而且我还打开了并行。

--//如果不开平行,几乎需要20分钟完成。

3.修改如下:

$ time ls -1 | xargs -P20 -r rm

real    0m30.573s

user    0m2.007s

sys     0m34.392s

--//几乎接近perl的执行效率,但是sys消耗很大。也就是利用平行执行,可以提高执行效率。

4.另外如果你使用find你可以发现执行效率并不是很高:

--//贴出我的测试结果。

$ time find . -name "*.txt" -print0 | xargs -P 20 -0 -r rm

real    2m14.205s

user    0m0.659s

sys     0m40.367s

$ time find ./ -delete

find: cannot delete ./: Invalid argument

real    2m37.203s

user    0m0.295s

sys     0m13.091s

$ time find ./ -type f -exec rm  {} \+  >/dev/null

real    2m38.328s

user    0m0.471s

sys     0m16.027s

5.分析为什么选择find执行更慢:

--//为什么呢?我开始相当然认为问题出在find的输出上。

$ find . -name "*.txt" -print | head -3

./326847.txt

./334810.txt

./341612.txt

--//我开始以为问题出在前面带有./,修改如下:

$ time find . -name "*.txt" -print| sed 's+^./++' | xargs -P 20 -r rm

real    2m19.387s

user    0m1.062s

sys     0m39.686s

--//依旧很慢。

$ time ls -f |  xargs -P 20 -r rm

rm: cannot remove `.' or `..'

rm: cannot remove `.' or `..'

real    2m38.970s

user    0m0.842s

sys     0m40.831s

--//我仅仅换成-f 执行时间就变成了2分38秒。再明白不过了,问题出在输出删除的顺序上。

--//ls -f顺序是乱的。find也是一样。

--//  -f     do not sort, enable -aU, disable -lst 什么意思不理解。

$ ls -f  | head -5

.

..

326847.txt

334810.txt

341612.txt

$ find  -name "*.txt" -print | head -5

./326847.txt

./334810.txt

./341612.txt

./432762.txt

./86199.txt

--//几乎是乱序的。linux到底如何读目录结构的,不理解....

$ ls -1 | head -5

100000.txt

100001.txt

100002.txt

100003.txt

100004.txt

100005.txt

$ ls -1 | sort -n | head -5

1.txt

2.txt

3.txt

4.txt

5.txt

--//可以发现ls -1仅仅基本"排序"输出。

$ time find . -name "*.txt" -print| sed 's+^./++' | sort -n |  xargs -P 20 -r rm

real    0m27.326s

user    0m1.508s

sys     0m33.834s

--//27秒。如果排序执行效率更高。

$ time find . -name "*.txt" -print|  sort -n |   xargs -P 20 -r rm

real    0m33.970s

user    0m2.852s

sys     0m34.469s

--//与find输出带./无关,我前面判断有点武断了。

$ time ls -1 | sort -n | xargs -P20 -r rm

real    0m36.091s

user    0m2.258s

sys     0m33.839s

总结:

--//从测试看如果删除顺序与建立顺序一致,视乎删除最快。我仅仅补充一点点自己的建议删除的顺序也很重要。

--//从这个例子:time ls -1 | xargs -IQ -P20 -r unlink Q 也可以看出删除文件顺序对于提高效率也很重要。

--//再次说明学习过程中一些细节很重要。

--//我的文件系统是ext3,有机会看看文件系统目录结构的格式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值