如何刪除 NFS 檔案系統上包含大量檔案的目錄

如何刪除 NFS 檔案系統上包含大量檔案的目錄

一個未經充分測試的程式在 NFS 共用上建立了一個包含大量檔案的目錄,我需要將其刪除。

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

目錄位於 netapp 類型裝置上約 600GB 的 NFS 掛載上。我實際上不知道其中有多少文件,但僅 10 分鐘後創建的類似目錄就有 121,000 個文件,因此可能有數百萬個文件。作業系統為Linux 2.6核心。

試圖找到一種方法來列出或刪除它及其內容。 find /home/foo 導致 find 在大約 1 小時後死亡,除了「./」之外沒有任何輸出

答案1

(回答我自己的問題,以防有人在搜尋類似內容時發現它。)目錄中可能有多達 900 萬個檔案。

不幸的是無法直接登入伺服器,它是一個設備。對檔案系統的唯一存取是透過匯出。

rm -rf 似乎不起作用。用 strace 觀察它掛了。

發現不會完成,死時沒有錯誤。

ls -1 似乎從未完成。 (我現在意識到它試圖對結果進行排序, ls -1f 最終可能會起作用)。

起作用的是一個簡單的 Perl 片段。我假設 c 程式碼做同樣的事情會起作用。

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }

答案2

這個相當古老的線程在谷歌上出現了,所以我想分享一些統計數據。

以下是在 NFS 伺服器上刪除檔案的三種不同方法的比較:

  1. 普通客房:rm dir/*
  2. 尋找:find dir/ -type f -exec rm {} \;
  3. 同步:tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

為了比較這些方法,我每次執行測試時都會建立 10000 個文件

for i in {1..10000} ; do touch $i ; done

圖中的結果表明,rsync 速度要快得多,而 find 是三種方法中最慢的 不同方法刪除多個檔案的效能,rsync更快

當文件數量加倍時(我沒有運行find20000 個文件),結果保持不變,平均時間為 10000 個文件運行 3 次和 20000 個文件運行 2 次。

        10000    20000
find     28.3       -
rm       12.9     23.9
rsync     6.94    12.2

有趣的是,看看這些方法的性能還取決於什麼。

相關的郵政此網站上討論了刪除 ext3 檔案系統上的大量檔案。

答案3

我建議您不要嘗試透過 NFS 刪除這些檔案 - 直接登入檔案伺服器並刪除那裡的檔案。這將大大減少對 NFS 伺服器(和客戶端)的濫用。

除此之外,使用 find (如 MattBianco 所描述)或使用ls -1 | xargs rm -f(從該目錄內)如果 find 無法完成(後者應該可以通過 NFS 正常工作,儘管我再次建議在本地執行)。

答案4

這看起來有點明顯,但你有嘗試過嗎:

rm -rf /home/foo/

?如果做不到這一點,有沒有一種方法可以使用正規表示式來取得足夠小的子集來傳遞|xargs rm

如果 ls 失敗,您可以嘗試echo /home/foo/* | xargs rm,但這可能會因“行太長”等而失敗。哦,我同意嘗試直接在伺服器上而不是透過 NFS 執行此操作的建議。

相關內容