Linux技巧:一次删除一百万个文件最快方法
昨天,我看到一個(gè)非常有趣的刪除一個(gè)目錄下的海量文件的方法。這個(gè)方法來(lái)自http://www.quora.com/How-can-someone-rapidly-delete-400-000-files里的Zhenyu Lee。
他沒(méi)有使用find 或 xargs,他很有創(chuàng)意的利用了rsync的強(qiáng)大功能,使用rsync –delete將目標(biāo)文件夾以一個(gè)空文件夾來(lái)替換。之后,我做了一個(gè)實(shí)驗(yàn)來(lái)比較各種方法。讓我吃驚的是,Lee的方法要比其它的快的多。下面就是我的測(cè)評(píng)。
環(huán)境:
- CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz
- MEM: 4G
- HD: ST3250318AS: 250G/7200RPM
| rsync -a –delete empty/ s1/ | 1000000 | 6m50.638s |
| find s2/ -type f -delete | 1000000 | 87m38.826s |
| find s3/ -type f | xargs -L 100 rm | 1000000 | 83m36.851s |
| find s4/ -type f | xargs -L 100 -P 100 rm | 1000000 | 78m4.658s |
| rm -rf s5 | 1000000 | 80m33.434s |
?
使用 –delete 和 –exclude,你可以選擇性刪除符合條件的文件。還有一點(diǎn),當(dāng)你需要保留這個(gè)目錄做其它用處時(shí),這種方法是再適合不過(guò)了。
重新測(cè)評(píng)
幾天前,Keith-Winstein在回復(fù)Quora上的這個(gè)帖子時(shí)說(shuō)我之前的測(cè)評(píng)無(wú)法復(fù)制,因?yàn)椴僮鞯臅r(shí)間持續(xù)的太久。我澄清一下,這些數(shù)據(jù)過(guò)大,可能是因?yàn)槲业挠?jì)算機(jī)在過(guò)去的幾年里做的事太多,測(cè)評(píng)中可能存在一些文件系統(tǒng)錯(cuò)誤。但我不確定是這些原因。現(xiàn)在好了,我弄了一天比較新的計(jì)算機(jī),把測(cè)評(píng)再做一次。這次我使用/usr/bin/time,它能提供更詳細(xì)的信息。下面就是新的結(jié)果。
(每次都是1000000個(gè)文件。每個(gè)文件的體積都是0。)
| rsync -a –delete empty/ a | 10.60 | 1.31 | 95 | 106/22 |
| find b/ -type f -delete | 28.51 | 14.46 | 52 | 14849/11 |
| find c/ -type f | xargs -L 100 rm | 41.69 | 20.60 | 54 | 37048/15074 |
| find d/ -type f | xargs -L 100 -P 100 rm | 34.32 | 27.82 | 89 | 929897/21720 |
| rm -rf f | 31.29 | 14.80 | 47 | 15134/11 |
?
原始輸出
# method 1 ~/test $ /usr/bin/time -v rsync -a --delete empty/ a/Command being timed: "rsync -a --delete empty/ a/"User time (seconds): 1.31System time (seconds): 10.60Percent of CPU this job got: 95%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:12.42Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 24378Voluntary context switches: 106Involuntary context switches: 22Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0# method 2Command being timed: "find b/ -type f -delete"User time (seconds): 0.41System time (seconds): 14.46Percent of CPU this job got: 52%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:28.51Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 11749Voluntary context switches: 14849Involuntary context switches: 11Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0 # method 3 find c/ -type f | xargs -L 100 rm ~/test $ /usr/bin/time -v ./delete.shCommand being timed: "./delete.sh"User time (seconds): 2.06System time (seconds): 20.60Percent of CPU this job got: 54%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:41.69Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 1764225Voluntary context switches: 37048Involuntary context switches: 15074Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0# method 4 find d/ -type f | xargs -L 100 -P 100 rm ~/test $ /usr/bin/time -v ./delete.shCommand being timed: "./delete.sh"User time (seconds): 2.86System time (seconds): 27.82Percent of CPU this job got: 89%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:34.32Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 1764278Voluntary context switches: 929897Involuntary context switches: 21720Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0# method 5 ~/test $ /usr/bin/time -v rm -rf fCommand being timed: "rm -rf f"User time (seconds): 0.20System time (seconds): 14.80Percent of CPU this job got: 47%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:31.29Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 0Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 176Voluntary context switches: 15134Involuntary context switches: 11Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0我真的十分好奇為什么Lee的方法要比其它的快,竟然比rm -rf也要快。如果有人知道,請(qǐng)寫(xiě)在下面,非常感謝。
[英文原文: A faster way to delete millions of files in a directory ]轉(zhuǎn)載于:https://www.cnblogs.com/hubing/p/3194378.html
總結(jié)
以上是生活随笔為你收集整理的Linux技巧:一次删除一百万个文件最快方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Marr的视觉计算理论
- 下一篇: 第一次打开Photoshop时的基本设置