Menghapus file secara massal di Windows

141

Saya memiliki direktori, yang berisi ~ 3 juta file dalam subdirektori tertentu pada server Windows 2008. Menghapus file secara manual melalui SHIFT + DEL pada direktori root membutuhkan waktu lama. Apakah ada cara lain untuk melakukan penghapusan dengan cara yang lebih cepat ?

Cfinley
sumber
1
Juga ditanyakan di sini di Stack Overflow: stackoverflow.com/questions/186737/…
Hugo
6
Bagaimana saya bisa menargetkan magnet ke beberapa subdirektori saja?
Jaime Hablutzel
7
@Jaime Dengan tangan mantap, seperti programmer sejati ... ;-) xkcd.com/378
Legionair
Bagaimana jika itu Drive SSD?
Benjamin Weiss
Jawaban untuk powershell: stackoverflow.com/questions/1752677/…
Warlike Chimpanzee

Jawaban:

179

PERINGATAN: jika Anda memiliki symlink ke direktori maka delakan menghapus direktori aktual dan bukan symlink. Berhati-hatilah dengan ini dan jangan jalankan perintah ini kecuali Anda tahu tidak ada symlink di dalam direktori target.


Saya secara teratur perlu menghapus banyak file dan direktori dari drive terenkripsi WinXP, biasanya sekitar 22 GB dari 500.000 file dalam 45.000 folder.

Menghapus dengan Windows Explorer adalah sampah karena membuang banyak waktu untuk menghitung file. Saya biasanya memindahkan barang yang perlu saya hapus ke C: \ stufftodelete dan memiliki file batch deletestuff.bat rmdir /s/q C:\stufftodelete. Ini dijadwalkan untuk berjalan di malam hari, tetapi kadang-kadang saya harus menjalankannya di siang hari agar semakin cepat semakin baik.

Berikut ini adalah hasil dari tes waktu cepat sampel kecil 5,85 MB dari 960 file dalam 303 folder. Saya menjalankan metode 1 diikuti oleh metode 2, lalu mengatur ulang direktori tes.

Metode 1 menghapus file dan struktur direktori dalam satu pass:

rmdir /s/q foldername

Metode 2 memiliki pass pertama untuk menghapus file dan output ke nul untuk menghindari overhead penulisan ke layar untuk setiap file menghanguskan. Lulus kedua kemudian membersihkan struktur direktori yang tersisa:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Metode 1: 17.5s, 14.9s, 13.9s, 14.8s, 13.8s: rata-rata 14.98 detik
  • Metode 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: rata-rata 12.82 detik

Berikut ini adalah hasil pengujian lain menggunakan 404 MB dari 19.521 file di 3.243 folder:

  • Metode 1: 2 menit 20 detik
  • Metode 2: 2 menit 33 detik

Jadi tidak banyak di dalamnya, mungkin terlalu dekat untuk menilai pada satu tes.


Sunting: Saya telah menguji ulang dengan lebih banyak data, ini adalah kasus khas bagi saya: 28,3 GB dari 1.159.211 file di 146.918 folder:

  • Metode 1: 2h 15m, 2h 34m: rata-rata: 2 jam 25 menit
  • Metode 2: 49m, 57m: rata-rata: 53 menit

Wow, metode 2 hampir tiga kali lebih cepat daripada metode 1! Saya akan memperbarui deletestuff.bat saya!

Hugo
sumber
RD / S / Q berfungsi dengan baik jika Anda menentukan jalur absolut tetapi tidak ketika bekerja dengan jalur relatif. Apakah ada solusinya?
Michael S.
1
@Hugo: Hugo, sebuah pertanyaan: Dalam pengujian berjangka waktu di atas, untuk salah satu atau kedua metode, apakah Anda menghitung file segera sebelum Anda menjalankan metode? Saya bertanya karena isi folder mungkin sudah ada dalam cache file OS. Terima kasih!
William C
@ WilliamC: Saya tidak ingat persis, tetapi untuk penghapusan berulang dengan konten yang sama saya akan menghitung segera sebelum hanya satu penghapusan, dan tidak akan mengulanginya untuk penghapusan lainnya (karena saya sudah tahu nomornya).
Hugo
1
Kedua rmdir dan del gagal ketika ada nama path lebih dari 256 karakter yang terlibat.
Nicolai Ehemann
1
PERINGATAN: jika Anda memiliki symlink ke direktori maka delakan menghapus direktori aktual dan bukan symlink. Berhati-hatilah dengan ini dan jangan jalankan perintah ini kecuali Anda tahu tidak ada symlink di dalam direktori target.
user0103
18

Jika Anda harus menghapus pohon direktori besar secara teratur, pertimbangkan untuk menyimpan root dari pohon direktori itu pada partisi yang terpisah, kemudian cukup memformatnya kapan pun Anda perlu menghapus semuanya. Jika Anda perlu mengotomatisasi ini, Anda dapat menggunakan perintah DOS ini:

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

di mana Z: adalah partisi 'volatil' Anda. Catatan: partisi harus tidak memiliki label. Saya membuat blog tentang ini di sini .

Tuan Bungle
sumber
Dan gunakan hardlink untuk membuat koneksi antara disk & direktori tempat file disimpan jika jalur direktori yang tepat diperlukan.
Nime Cloud
1
@NimeCloud: Hardlink tidak dapat melintasi sistem file atau menautkan direktori.
grawity
5
Namun, tautan simbolik dapat melintasi sistem file dan tautan direktori, sehingga mungkin sesuai di sini. Lihat perintah mklink (Vista dan yang lebih baru; jika tidak, gunakan persimpangan dari Mark Russinovich / SysInternals.)
Robert Calhoun
9

Pada prompt perintah (Mulai -> Jalankan -> cmd):

del /f /s /q foldername 
lmsasu
sumber
Ini bagus karena ia mencantumkan apa yang dihapus .. tetapi sama dengan rd dalam hal kecepatan.
bobobobo
1
Oh Woah Woah Woah. Tidak sebagus yang saya kira. Itu menghapus file dengan cepat tetapi meninggalkan pohon direktori utuh.
bobobobo
1
Yang mungkin saya tambahkan membutuhkan waktu yang cukup lama untuk dihapus menggunakan rd.
bobobobo
3
@ bobobobo Saya melakukan beberapa tes dengan ~ 30GB / 1.000.000 file / 15.000 folder dan del + rd hampir tiga kali lebih cepat daripada hanya rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo
1
Ini akan gagal jika pathname lebih panjang dari 256 charachters.
Nicolai Ehemann
7

Selain menyalin / memindahkan file dengan sangat cepat (menggunakan API sendiri), TeraCopy dapat menghapus file dan juga sangat cepat. Sejak menemukan TeraCopy saya tidak menggunakan komputer tanpa menginstalnya (jika saya akan menyalin / memindahkan / menghapus).

Installer yang sama menginstal edisi x64 tetapi untuk menggunakannya Anda harus memaksanya secara manual.

Beta yang saya rekomendasikan untuk versi stabil: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

rautamiekka
sumber
Pernahkah Anda melakukan atau melihat perbandingan waktu suka-dengan-suka dari TeraCopy vs rmdir atau del atau del + rmdir?
Hugo
1
@ Hugo: Pertanyaan bodoh. Saya tidak akan merekomendasikan TeraCopy jika tidak terlihat oleh mata biasa lebih cepat!
rautamiekka
5
Jadi, apakah Anda memperkirakan 10% lebih cepat? Dua kali lebih cepat? Sepuluh kali lebih cepat? Satu juta kali lebih cepat? Akan lebih bagus jika Anda dapat mengatur waktu terhadap rmdir dengan dua set tes besar dan identik.
Hugo
1
Terima kasih! Saya telah menggunakan TeraCopy selama bertahun-tahun, tetapi tidak pernah tahu tentang fungsi penghapusan massal. Dan Anda benar, ini jauh, BANYAK lebih cepat!
AzDayton
1
@Amalgovinus Anda tidak. Anda dapat membuka program dan menambahkan file / folder melalui drag-drop atau klik kanan, atau klik kanan file / folder Anda di Explorer / di desktop. Setelah selesai berjalan mereka, cukup klik 'Hapus' dan 'Pindahkan ke Keranjang Sampah' jika Anda mau, tapi saya lebih suka 'Hapus dari disk'. Namun, Anda harus mem-boot TeraCopy sebagai Admin untuk membuatnya muncul di desktop / Explorer klik kanan jika tidak dilakukan secara default.
rautamiekka
6

Saya melakukan file kelelawar yang melakukan hal yang sama.

@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

itu berfungsi dalam dua langkah, satu, itu mencoba untuk menghapus file. Dan yang kedua adalah mencoba mengambil kepemilikan atas file-file tersebut. y harus diubah sesuai dengan lokal Anda (singkatan yes dalam bahasa Inggris). Jika gagal tugas (misalnya jika gagal karena izin) maka Anda harus menjalankannya lagi. Namun, ronde kedua tidak akan mencoba untuk menghapus file yang dihapus di ronde pertama, sehingga bisa sangat cepat.


Bagaimana cara menggunakannya. Simpan sebagai delfolder.bat dalam rute jalur (misalnya c: \ windows), lalu jalankan sebagai

 delfolder "foldername"   

di mana foldername adalah nama folder

Dalam pengujian saya, menghapus 123'000 file membutuhkan waktu 3 menit (sata 7200rpm). YAY!

magallanes
sumber
1
Biasanya Anda tidak boleh menggunakan %1skrip, tetapi "%~1". Dengan cara ini, jika argumen telah diloloskan dengan tanda kutip, itu dikutip dan dikutip ulang. Jika belum lulus dengan kutipan, itu dikutip.
Benoit
4

Menggunakan kode di bawah ini biasanya berfungsi dengan baik untuk saya.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
Benoit
sumber
Tambahkan `> nul` di akhir panggilan robocopy itu sehingga Anda tidak perlu melihatnya di layar.
JoshDM
Ini mirip dengan penggunaan rsyncdi Linux. Bahkan di sini lebih cepat rmdir?
Hastur
FYI, robocopy ini sangat berbeda dengan del /f/q/s+ rmdir /s/q. Jika dir_to_wipe Anda memiliki junktions untuk c:\some_important_dirAnda, pada akhirnya akan kehilangan data Anda.
Pavel P
@Pavel lalu gunakan / XJ untuk mengecualikan titik persimpangan dan tautan simbolik?
Bernhard
Ini melakukan trik untuk direktori ~ 36GB yang memiliki ratusan direktori dan file yang> 256 karakter menyebabkan "metode" del / rmdir gagal total. Ini mengambil detik, Windows Explorer memperkirakan JAM!
3

Gunakan perintah rd / s dari command prompt.

JP Alioto
sumber
2
Tidak. Ini selambat menghapus dari penjelajah.
bobobobo
Baiklah, tidak apa-apa. Bagaimanapun, berfungsi lebih baik daripada del / f / s / q.
bobobobo
3
Yah, ini JAUH lebih baik daripada menggunakan Explorer untuk menghapus, sebenarnya. Itu terus menghapus, bahkan jika satu atau dua penghapusan akan gagal (di mana penjelajah tersedak dan batal)
bobobobo
2

Solusi praktis terbaik mungkin adalah memindahkan folder keluar dari suatu tempat (misalnya Recycle Bin) dan kemudian mulai menghapusnya. Itu akan memakan waktu lama, tetapi setidaknya itu akan keluar dari jalan.

Saya cukup yakin waktu yang diperlukan untuk menghapus semua file tersebut merupakan persyaratan yang melekat pada tugas tersebut, bukan inefisiensi dalam implementasi penghapusan.

Ryan Thompson
sumber
1

Instal Cygwin dan gunakan rm -r . Tapi itu mungkin berlebihan.

CarlF
sumber
Itu persis sama dengan rd /q /s...
Joey
Terlalu banyak tugas, dan kecepatan yang hampir setara!
adeelx
1
Tidak lebih buruk dari beberapa jawaban instal-alat-X-dan-gunakan-lain di sini, dan tidak boleh ditolak jika tidak ada.
JdeBP
2
Apakah cygwin rmbenar-benar secepat cmd.exe builtin rd? Karena emulasi cygwin dari antarmuka posix agak lambat karena perlu melakukan beberapa pekerjaan ekstra, itu rmsebenarnya tidak menghargai.
Jan Hudec
Sambil menunggu koleksi besar file untuk dihapus saya punya cukup waktu untuk menginstal Cygwin dan mencoba rm -rf. Sekitar 10 menit di saya dibatalkan dan kembali ke del /f/s/qkarena di bawah Cygwin, penggunaan disk hanya 50%. Di bawah del, penggunaan disk dipatok pada 100%. Jadi saya pikir itu harus dihapus lebih cepat. Penggunaan CPU adalah <1% untuk kedua metode. Saya tidak yakin pada nomor file karena saya menutup Windows File Deleter setelah menghabiskan 10 menit menghitung.
Derek Ziemba
1

Apakah Anda mengaktifkan pembuatan nama file pendek? Jika demikian, apakah Anda benar-benar membutuhkannya? Menghapus file hanyalah operasi metadata. Jadi, jika Anda memiliki dua kali jumlah nama untuk dihapus, jumlah pekerjaan secara signifikan lebih tinggi.

MSalters
sumber
0

Sudahkah Anda mencoba salah satu dari kedua aplikasi ini?

Pastikan untuk mengatur jumlah timpa ke 0 jika Anda ingin kinerja tercepat. Lakukan ini dengan mengeklik opsi lalu ubah nilainya di bagian bawah dialog.

Masukkan jalur untuk menghapus di bidang Sumber dan kemudian klik Hapus.

Aplikasi ini tidak meletakkan file di tempat sampah. Gunakan dengan hati-hati.

Stephen Kellett
sumber
0

Ini disediakan untuk melengkapi dan menambah langkah-langkah yang diambil dalam jawaban yang disebutkan sebelumnya.

Dua metode yang diberikan di atas tampaknya cukup efektif, tetapi untuk menentukan kinerjanya akan sulit kecuali jika disatukan dengan kondisi yang sama persis:

  • Perangkat & Model Hard Drive Fisik
    • Lebih disukai, ATTO / Crystal Disk melakukan benchmark sebelum mengkloning data pada mereka
  • Partisi yang Sama / Lokasi Volume & Geometri
    • Cara untuk melakukan ini adalah men-defrag sampel partisi / folder dan mengkloningnya persis seperti 2 jenis Hard Drive yang sama persis (dari langkah sebelumnya)
  • Kemudian jalankan konfigurasi melalui File Batch dan gunakan Powershell Cmdlet untuk login dan mengukur kinerjanya.

    • Idealnya, tambahkan beberapa mekanisme untuk mencegah bias caching karena kebaruan dari kegiatan serupa.
  • Berikut ini adalah beberapa folder sampel (dinamai sebagai ukuran total) yang saya coba tetapi tidak bisa mendapatkan kinerja / hasil konklusif.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Saya telah memposting file log keluaran, tapi saya percaya variansnya sangat besar karena ukuran & distribusi file folder dll.

Powershell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
Alex S
sumber
gagal dengan nama> 256 karakter
0

Jawaban dari Hugo adalah yang tercepat tetapi tidak menghapus file sistem atau tersembunyi di pass pertama, jadi jika Anda menginginkan solusi yang lebih lengkap gunakan parameter / a:

del /f /s /q /a foldername > nul
rmdir /s /q foldername

Tentang file BAT oleh Magallanes , berhati-hatilah dengan takeown dan icacls, menyebabkan hardlink berbagi izin dan pemilik yang sama, jadi jika ada hardlink tak jenuh dalam folder yang ingin Anda hapus, menggunakan takeown dan icacl akan mengubah izin dan pemilik file di luar folder.

Dengan menggunakan alat ln.exe, Anda dapat membuat daftar semua file yang di-hardlink di dalam folder dan mengetahui apakah mereka di-hardlink ke file di luar folder (hardlink tidak jenuh):

ln.exe --enum foldername > HardlinksList.txt
liamZ
sumber
-1

Menghapus folder lebih cepat daripada menghapus banyak file.

Jadi jika Anda lebih suka menggunakan mouse daripada command prompt, Anda dapat membuat direktori, memindahkan file di sana dan menghapusnya (dengan Shift + Del seperti yang Anda katakan).

danijelk
sumber
2
Direktori harus dibuat pada partisi yang sama di mana file berada. Ini akan membuat tindakan tindakan instan. Jika folder baru dan file berada di partisi yang terpisah, maka seluruh operasi salin akan banyak.
5
Di mana Anda mendapatkan gagasan bahwa menghapus folder lebih cepat daripada menghapus file di dalamnya? Menghapus folder berisi sebagai langkah pertama untuk menghapus semua file di folder itu, sehingga tidak bisa lebih cepat. Pindah ke tempat sampah adalah hal yang sama sekali berbeda, tapi itu bukan pertanyaan di sini.
Joey