目錄裡面的檔案太多,要砍掉會遇到下述問題:
- rm -f *
-bash: /bin/rm: Argument list too long
這個問題此篇已經有解法:檔案數太多砍不掉該怎麼辦
不過還是要砍很久,要怎麼辦呢?(通常遇到這種時,都要砍個半天以上)
Linux 快速清除「檔案數量太多」的速度比較
此篇文章有把砍大量檔案的方法與花費時間做個測試紀錄,可以參考看看。
先看結論,最快的是這種方法:perl -e 'for(<*>){((stat)[9]<(unlink))}'
下述摘錄自此篇:Which is the fastest method to delete files in Linux
- RM Command Is not capable of deleting large number of files
$ time rm -f *
-bash: /bin/rm: Argument list too long
real 0m11.126s
user 0m9.673s
sys 0m1.278s - Find Command with -exec 14 Minutes for half a million files
$ time find ./ -type f -exec rm {} \;
real 14m51.735s
user 2m24.330s
sys 9m48.743s - Find Command with -delete 5 Minutes for half a million files
$ time find ./ -type f -delete
real 5m11.937s
user 0m1.259s
sys 0m28.441s - Perl 1 Minute for half a million files
$ time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real 1m0.488s
user 0m7.023s
sys 0m27.403s - RSYNC with -delete 2 Minute 56 seconds for half a million files
$ time rsync -a --delete blanktest/ test/
real 2m52.502s
user 0m2.772s
sys 0m32.649s - Hank 大大補充:find ./ -type f | xargs rm -f 速度比 "find ./ -type f -exec rm {} \;" 快10倍,跟 perl 那招的速度差不多(比較慢一點),不過可以加上 cmin .. 等等,彈性比較大
- cktsai 補充:xargs -P8 可以用8個處理器來一起平行做事情(看你的機器多大;有的也許20個核心)。 一般來說 可以用 xargs -I {} -P8 rm -f {} 來確保 {} 是放對了檔案的argument位子。
- find . -type f -print0 | xargs -0 -I {} rm -f {}
试过,perl -e 'for(){((stat)[9]<(unlink))}' 应该是 perl -e 'for(){((stat)[9]<(unlink))}' ?应该中间少了一个星号,否则执行不了。原文也是如此。
確實漏了,用 Markdown 轉內容時,* 被轉掉了,感謝指正~
xargs -P8 可以用8個處理器來一起平行做事情(看你的機器多大;有的也許20個核心)。 一般來說 可以用 xargs -I {} -P8 rm -f {} 來確保{}是放對了檔案的argument位子。
感謝,我先來補上去,再來測試看看速度如何~
原先一直以為用 rsync 是最快的方法 ... 沒想到居然可以用 perl 解而解速度還更快!
不過我經驗是使用 find 再 pipe 出去不小心就會遇到一些特定字元造成後面命令執行爛掉的問題 (須加一些參數調整改善,但沒測過不確定是不是 100% 都可以解決), find -exec , find -delete 則沒有這個困擾
您好,想問一下 我目前有一個含及大量的零碎小檔案(500萬個檔案)的資料夾需要刪除,每當我要下 " rm -rf 目標資料夾 " 或是進那個目標資料夾裡面下 " rm -rf * " 最後都會跑到機器當掉卡死要重開....
想請問說有什麼刪除法可以安穩的刪除資料,可以不用快只要可以完成這件事就好呢?因為該機器還有很多服務在跑所以不太改隨便嘗試。
可以用您文章中提到的 find ./ -type f -exec rm {} \; 來做處理可以嗎?
先試試看用 find 這個處理看看,不過要給他時間跑~~