題 批量刪除Windows中的文件


我有一個目錄,在Windows 2008服務器上的某些子目錄中包含約300萬個文件。通過根目錄上的SHIFT + DEL手動刪除文件需要很長時間。還有其他方法可以在a中刪除 快點 方式?


130
2017-08-07 07:00


起源


Stack Overflow也在這裡問到: stackoverflow.com/questions/186737/... - Hugo
我怎麼能只將磁鐵定位到某些子目錄? - Jaime Hablutzel
@Jaime用穩定的手,就像一個真正的程序員... ;-) xkcd.com/378 - Legionair
如果它是SSD驅動器怎麼辦? - Benjamin Weiss


答案:


我經常需要從WinXP加密驅動器中刪除大量文件和目錄,通常是45,000個文件夾中的大約22 GB的500,000個文件。

使用Windows資源管理器刪除是垃圾,因為它浪費了大量時間來枚舉文件。我通常將我需要刪除的東西移到C:\ stufftodelete並有一個deletestuff.bat批處理文件 rmdir /s/q C:\stufftodelete。這計劃在晚上運行,但有時我需要在白天運行它,所以越快越好。

這是對303個文件夾中的小型5.85 MB 960文件樣本進行快速時間測試的結果。我運行方法1,然後運行方法2,然後重置測試目錄。

方法1在一次傳遞中刪除文件和目錄結構:

rmdir /s/q foldername

方法2有第一次刪除文件和輸出到nul,以避免為每個單個文件寫入屏幕的開銷。第二遍然後清理剩餘的目錄結構:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • 方法1:17.5s,14.9s,13.9s,14.8s,13.8s:平均值 14.98秒
  • 方法2:14.3s,12.1s,11.7s,14.2s,11.8s:平均值 12.82秒

這是在3,243個文件夾中使用404 MB的19,521個文件的另一個測試的結果:

  • 方法1: 2分20秒
  • 方法2: 2分33秒

因此,它沒有多少,可能太接近於在單個測試中判斷。


編輯:我已經重新測試了更多的數據,這是我的典型案例:146,918個文件夾中的28.3 GB的1,159,211個文件:

  • 方法1:2小時15分鐘,2小時34分鐘:平均值: 2小時25分鐘
  • 方法2:49米,57米:平均: 53分鐘

哇,方法2比方法1快近三倍!我將更新我的deletestuff.bat!


168
2018-05-27 11:27



如果指定絕對路徑,則RD / S / Q工作正常,但在使用相對路徑時則不然。有解決方案嗎? - Michael S.
@Hugo:Hugo,一個問題:在上述定時測試中,對於其中一種或兩種方法,您是否在運行該方法之前立即計算了文件?我問,因為文件夾內容可能已經在OS文件緩存中。謝謝! - William C
@WilliamC:我不記得確切,但對於重複刪除的內容相同,我只會在一次刪除之前立即計算,並且不會重複其他刪除(因為我已經知道了數字)。 - Hugo
你的時間安排是否包括將146,918個文件夾中的1,159,211個文件移動到 C:\stufftodelete 夾? - martineau
@martineau:不,測試時間是(如果我沒記錯的話)刪除文件夾。通常可以快速將文件夾移動到 C:\stufftodelete`. Copying is slooow, but you don't want that. If you have another drive (eg E:), also create E:\ stufftodelete`並始終將文件移動到同一個驅動器的文件夾中,並將其包含在deletestuff.bat中(它還會在下次重新創建文件夾)。 - Hugo


如果必須定期刪除大型目錄樹,請考慮將該目錄樹的根目錄存儲在單獨的分區上,然後只需在需要刪除所有內容時快速格式化它。如果需要自動執行此操作,可以使用此DOS命令:

echo Y | format Z: /FS:NTFS /X /Q

其中Z:是你的“易變”分區。注意:分區必須沒有標籤。我在博客上寫了這個 這裡


16
2017-10-31 06:37



並使用硬鏈接在磁盤和目錄之間創建連接,如果需要精確的目錄路徑,則存儲文件。 - Nime Cloud
@NimeCloud:硬鏈接無法跨文件系統或鏈接目錄。 - grawity
但是,符號鏈接 能夠 交叉文件系統和鏈接目錄,因此它們可能適合這裡。請參閱mklink命令(Vista及更高版本;否則請使用Mark Russinovich / SysInternals的聯結。) - Robert Calhoun


在命令提示符下(開始 - >運行 - > cmd):

del /f /s /q foldername 

9
2017-08-07 07:07



這很棒,因為它列出了它的刪除內容..但它在速度方面與rd相同。 - bobobobo
哦,哇哇哇哇。不像我想的那麼好。它會快速刪除文件,但保留目錄樹。 - bobobobo
我可能會添加相當長的時間來清除使用rd。 - bobobobo
@bobobobo我用~30GB / 1,000,000個文件/ 15,000個文件夾做了一些測試,del + rd比rd快了近三倍: superuser.com/questions/19762/mass-deleting-files-in-windows/... - Hugo
我認為rmdir在某些情況下更快。德爾 。 / f / s / q很好,因為您還可以刪除目錄中所有文件的內容。完成後,只需刪除足夠快的文件夾即可。另外,請記住attrib -s -h -r 。 / s如果由於隱藏文件而無法刪除文件夾。 - Sun


除了快速復制/移動文件(使用自己的API)之外,TeraCopy還可以刪除文件,而且速度也非常快。自從發現TeraCopy以來,我沒有使用沒有安裝它的計算機(如果我要復制/移動/刪除)。

相同的安裝程序會安裝x64版本,但要使用它,您必須手動強制它。

我推薦的穩定版測試版: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


6
2018-05-25 14:00



您是否曾經做過或看到過與TeraCopy與rmdir或del或del + rmdir相似的時間比較? - Hugo
@Hugo:愚蠢的問題。我不推薦TeraCopy,如果用普通的眼睛看不到它會更快! - rautamiekka
所以你估計它快了10%?快兩倍?十倍的速度?快一百萬倍?如果你能用兩個大而相同的測試集來對抗rmdir,那就太棒了。 - Hugo
@Hugo:取決於文件​​大小/數量和碎片和CPU,2x到5x但通常太快,如果你節省了一會兒或者20,那麼考慮使用Win-integrated手段進行大文件和/或crapload文件通常太快了。[重新編輯意外命中後輸入] - rautamiekka
謝謝!我多年來一直在使用TeraCopy,但從未知道質量刪除功能。而且你是對的,它更快,更快! - AzDayton


我做了一個同樣的bat文件。

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

它分兩步完成工作,一,它試圖刪除文件。第二個是嘗試獲取文件的所有權。 ÿ 應根據您當地的情況進行更改(英文中的“是”)。 如果任務失敗(例如,如果因為權限而失敗),則必須再次運行它。但是,第二輪不會嘗試刪除第一輪中刪除的文件,因此可能非常快。


如何使用它。在路徑路徑中保存為delfolder.bat(例如c:\ windows),然後將其運行為

 delfolder "foldername"   

其中foldername是文件夾的名稱

在我的測試中,刪除123'000文件需要3分鐘(sata 7200rpm)。好極了!


5
2018-02-09 17:35



這個小腳本真棒。謝謝。 - Jeson Martajaya
通常你不應該使用 %1 在腳本中,但是 "%~1"。這樣,如果參數已經用引號傳遞,則將其引用並重新引用。如果它沒有帶引號,則引用它。 - Benoit


使用 rd / s命令 從命令提示符。


3
2017-08-07 07:09



不。這與從資源管理器中刪除一樣慢。 - bobobobo
好吧,好吧。無論如何,比del / f / s / q更好。 - bobobobo
實際上,這比使用資源管理器刪除要好得多。它繼續刪除,即使刪除或兩個將失敗(資源管理器窒息和中止) - bobobobo


使用下面的代碼通常適合我。

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe

3
2017-12-23 15:47



在該robocopy調用的末尾添加一個`> nul`,這樣您就不必在屏幕上看到它。 - JoshDM
它類似於使用 rsync 在Linux中。它甚至比這更快 rmdir? - Hastur
僅供參考,這個robocopy是非常不同的 del /f/q/s + rmdir /s/q。如果你的dir_to_wipe有垃圾郵件 c:\some_important_dir 你最終會失去你的數據。 - Pavel


最實用的解決方案可能是將文件夾移出某處(例如回收站),然後開始刪除它。這需要很長時間,但至少它會被淘汰。

我很確定刪除所有這些文件所需的時間是任務的固有要求,而不是執行刪除的低效率。


1
2017-10-06 21:59