Linux 快速清除「檔案數量太多」的速度比較

目錄裡面的檔案太多,要砍掉會遇到下述問題:

  • 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位子。

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Linux 快速清除「檔案數量太多」的速度比較〉中有 7 則留言

  1. 试过,perl -e 'for(){((stat)[9]<(unlink))}' 应该是 perl -e 'for(){((stat)[9]<(unlink))}' ?应该中间少了一个星号,否则执行不了。原文也是如此。

  2. xargs -P8 可以用8個處理器來一起平行做事情(看你的機器多大;有的也許20個核心)。 一般來說 可以用 xargs -I {} -P8 rm -f {} 來確保{}是放對了檔案的argument位子。

  3. 原先一直以為用 rsync 是最快的方法 ... 沒想到居然可以用 perl 解而解速度還更快!
    不過我經驗是使用 find 再 pipe 出去不小心就會遇到一些特定字元造成後面命令執行爛掉的問題 (須加一些參數調整改善,但沒測過不確定是不是 100% 都可以解決), find -exec , find -delete 則沒有這個困擾

  4. 您好,想問一下 我目前有一個含及大量的零碎小檔案(500萬個檔案)的資料夾需要刪除,每當我要下 " rm -rf 目標資料夾 " 或是進那個目標資料夾裡面下 " rm -rf * " 最後都會跑到機器當掉卡死要重開....

    想請問說有什麼刪除法可以安穩的刪除資料,可以不用快只要可以完成這件事就好呢?因為該機器還有很多服務在跑所以不太改隨便嘗試。
    可以用您文章中提到的 find ./ -type f -exec rm {} \; 來做處理可以嗎?

cktsai 發表迴響取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料