
一個未經充分測試的程式在 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 伺服器上刪除檔案的三種不同方法的比較:
- 普通客房:
rm dir/*
- 尋找:
find dir/ -type f -exec rm {} \;
- 同步:
tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir
為了比較這些方法,我每次執行測試時都會建立 10000 個文件
for i in {1..10000} ; do touch $i ; done
圖中的結果表明,rsync 速度要快得多,而 find 是三種方法中最慢的
當文件數量加倍時(我沒有運行find
20000 個文件),結果保持不變,平均時間為 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 執行此操作的建議。