Debian - 刪除數千個文件

Debian - 刪除數千個文件

我有一台運行 Debian Squeeze 的機器,其中包含 apache、mysql、php...在其中一個目錄中還有一些其他目錄和超過 500k 文件的太多文件,我嘗試通過 WinSCP 刪除,但它掛起。即使超過 24 小時後,WinSCP 仍然沒有回應。目前,我嘗試使用 Putty (rm -rf dirname) 刪除目錄,但就像 WinSCP 一樣,它變得沒有回應。有什麼建議麼?謝謝!

我有機器的 root 存取權。

答案1

刪除目錄應該可以。如果您嘗試刪除單個文件,您可能會遇到麻煩,因為文件太多。你不是在跑步rm -rf dirname/*嗎?

我的猜測是,您由於不活動而失去了 ssh 連接,您確定該命令未在伺服器上正確執行嗎?

無論如何,一個可能的解決方法是使用諾哈普:

nohup rm -rf dirname

您可以啟動命令並註銷,它將在後台繼續。


更新:

我發現這個問題在U&L.SE,我建議你看看。不幸的是,我無法重現您的問題。我創建了一個包含 2516007 個檔案的目錄,並且可以隨時使用以下命令刪除它rm -rf

$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l 
  2516007     <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
  real  23m11.695s
  user  0m3.540s
  sys           0m42.891s

因此,花了 20 分鐘刪除了約 200 萬個空檔。刪除大量非空檔案可能需要幾個小時,這似乎是合理的。

無論如何,U&L 問題中的一些建議應該會有所幫助。具體是這個:

find /delb -type f  --delete

或這個(在原來的基礎上稍作修改)

find /delb -type f -print0 | xargs -0r rm -f

最後,您可以做的一個技巧是一次刪除幾個檔案。如果您知道某些檔案名稱以字串「foo」開頭,其他檔案名稱以「bar」等開頭,請執行下列操作:

rm -rf /delb/foo*
rm -rf /delb/bar*

等等。你也可以嘗試這樣的事情:

for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done

最後一條指令將依序刪除以字母表中的每個字母開頭的每個檔名,然後刪除以數字開頭的所有檔名。

答案2

作為未發布答案的一方。根據我處理索引節點耗盡的檔案系統的經驗。文件系統上有超過十億個文件。

刪除/列出檔案的最快方法是使用 find,特別是如果您有數千個檔案/目錄。如果不需要進行擴展,Find 會立即開始工作。

尋找 /path/to/be/deleted -type f --delete

不要使用*或任何其他類型的命令列擴充功能作為命令的一部分。*在傳遞給命令 rm / ls 等之前在終端中執行。這非常慢。

man bash
...
EXPANSION
命令列被分割成單字後進行擴展。執行了七種擴展:大括號擴展、波形符擴展、參數和變數擴展、命令替換、算術擴展、分詞和路徑名擴展。

相關內容