Saya memiliki direktori yang berisi jutaan subdirektori dan triliunan file. Dan sekarang saya harus membersihkannya. Mengatakan triliun, saya tidak berbicara tentang ukuran file, tetapi jumlah file.
Saya sudah mencoba menghapusnya dengan del/s
, dan menggunakan Windows Explorer. Tidak ada yang bisa menyelesaikan tugas. Saya sudah mencoba menghapus beberapa subdirektori satu per satu, dan itu butuh waktu berhari-hari. Masalah yang saya temui adalah bahwa setiap kali, tidak masalah menggunakan del
atau Explorer, saya dapat melihat di Task Manager bahwa instance explorer mengkonsumsi memori setinggi langit, dan secara bertahap mendorong sistem saya untuk crash.
Masih ada beberapa ratus juta file yang akan dihapus. Apakah ada kemungkinan untuk dicapai dengan satu (atau hanya beberapa) perintah / tindakan?
[Diedit]
Saya sudah mencoba melakukannya dengan Cygwin rm -fr
, dan membuahkan hasil yang sama. Diringkas sebagai:
Tidak masalah menggunakan Windows Explorer,
DEL
dari command prompt, ataurm
perintah Cygwin , memori Sistem secara bertahap turun ke nol, dan kotak akhirnya akan crash.Jika suatu saat, sebelum sistem gagal, proses ditutup (dengan CTRL + C atau apa pun), kotak akan terus berfungsi seperti biasa. Namun, semua memori yang digunakan TIDAK akan dibebaskan. Katakanlah, saya telah menghentikan proses sementara memori sistem mencapai 91%, Task Manager memberi tahu: RAM total 4G, Cache adalah 329M, dan Tersedia 335MB. Maka penggunaan memori akan tetap di tingkat ini sampai saya me-reboot mesin. Jika saya menghentikan instance explorer di Task Manager, layar akan kosong dengan lampu HDD sepanjang waktu menyala, dan tidak pernah kembali. Biasanya, ketika saya menghentikan instance explorer di Task Manager, saya bisa memohon kembali dengan menekan Win + E, atau itu dimulai ulang secara otomatis.
Ya, manajemen memori yang sangat bagus!
[EDIT LAGI] Sepertinya beberapa memori yang digunakan memang dibebaskan setelah beberapa saat, tetapi tidak semua. Beberapa memori yang Di-cache & Tersedia kembali di Task Manager. Saya belum menunggu lagi, tidak yakin apa yang akan terjadi kemudian.
sumber
Jawaban:
Penjelasan Teknis
Alasan bahwa sebagian besar metode menyebabkan masalah adalah bahwa Windows mencoba untuk menghitung file dan folder. Ini bukan masalah besar dengan beberapa ratus — atau bahkan ribuan — file / folder sedalam beberapa level, tetapi ketika Anda memiliki triliunan file dalam jutaan folder yang mencapai puluhan level dalam, maka itu pasti akan membuat sistem macet. .
Mari Anda memiliki "hanya" 100.000.000 file, dan Windows menggunakan struktur sederhana seperti ini untuk menyimpan setiap file beserta path-nya (dengan cara itu Anda menghindari menyimpan setiap direktori secara terpisah, sehingga menghemat beberapa overhead):
Bergantung pada apakah ia menggunakan karakter 8-bit atau karakter Unicode (menggunakan Unicode) dan apakah sistem Anda 32-bit atau 64-bit, maka diperlukan memori antara 25GB dan 49GB untuk menyimpan daftar (dan ini sangat struktur yang disederhanakan).
Alasan mengapa Windows mencoba untuk menghitung file dan folder sebelum menghapusnya bervariasi tergantung pada metode yang Anda gunakan untuk menghapusnya, tetapi Explorer dan interpreter perintah melakukannya (Anda dapat melihat penundaan saat Anda memulai perintah). Anda juga dapat melihat flash aktivitas disk (HDD LED) saat membaca pohon direktori dari drive.
Larutan
Taruhan terbaik Anda untuk menghadapi situasi semacam ini adalah dengan menggunakan alat hapus yang menghapus file dan folder satu per satu, satu per satu. Saya tidak tahu apakah ada alat siap pakai untuk melakukannya, tetapi harus mungkin untuk mencapai dengan sederhana batch-file tersebut.
Apa yang dilakukan adalah memeriksa apakah argumen telah disetujui. Jika demikian, maka itu berubah ke direktori yang ditentukan (Anda dapat menjalankannya tanpa argumen untuk memulai di direktori saat ini atau menentukan direktori — bahkan pada drive lain untuk memulainya di sana).
Selanjutnya, itu menghapus semua file di direktori saat ini. Dalam mode ini, seharusnya tidak menghitung apa pun dan cukup menghapus file tanpa menyedot banyak, jika ada, memori.
Kemudian ia menyebutkan folder di direktori saat ini dan memanggil dirinya sendiri, meneruskan setiap folder ke sana (sendiri) untuk muncul kembali ke bawah.
Analisis
Alasan ini harus bekerja adalah karena ia tidak menyebutkan setiap file dan folder tunggal di seluruh pohon . Itu tidak menyebutkan file sama sekali, dan hanya menyebutkan folder di direktori saat ini (ditambah yang tersisa di direktori induk). Dengan asumsi hanya ada beberapa ratus sub-direktori dalam folder yang diberikan, maka ini seharusnya tidak terlalu buruk, dan tentu saja membutuhkan memori jauh lebih sedikit daripada metode lain yang menyebutkan seluruh pohon.
Anda mungkin bertanya-tanya tentang menggunakan
/r
sakelar alih-alih menggunakan rekursi (manual). Itu tidak akan berhasil karena ketika/r
switch melakukan rekursi, ia melakukan pre-enumerasi seluruh pohon direktori yang persis apa yang ingin kita hindari; kami ingin menghapus saat kami pergi tanpa melacak.Perbandingan
Mari kita bandingkan metode ini dengan metode enumerasi penuh.
Anda telah mengatakan bahwa Anda memiliki "jutaan direktori"; katakanlah 100 juta. Jika pohon kira-kira seimbang, dan dengan asumsi rata-rata sekitar 100 sub-direktori per folder, maka direktori bersarang paling dalam akan sekitar empat tingkat ke bawah — sebenarnya, akan ada 101.010.100 sub-folder di seluruh pohon. (Lucu bagaimana 100M dapat dipecah menjadi hanya 100 dan 4.)
Karena kita tidak menghitung file, kita hanya perlu melacak paling banyak 100 nama direktori per level, untuk maksimum
4 × 100 = 400
direktori pada waktu tertentu.Oleh karena itu persyaratan memori harus ~ 206.25KB, baik dalam batas-batas sistem modern (atau lainnya).
Uji
Sayangnya (?) Saya tidak memiliki sistem dengan triliunan file di jutaan folder, jadi saya tidak dapat mengujinya (saya percaya pada hitungan terakhir, saya memiliki sekitar ~ 800 ribu file), jadi orang lain harus mencoba Itu.
Peringatan
Tentu saja ingatan bukan satu-satunya batasan. Drive akan menjadi hambatan besar juga karena untuk setiap file dan folder yang Anda hapus, sistem harus menandainya sebagai gratis. Untungnya, banyak dari operasi disk ini akan dibundel bersama (di-cache) dan ditulis dalam potongan-potongan alih-alih secara individual (setidaknya untuk hard drive, bukan untuk media yang dapat dilepas), tetapi masih akan menyebabkan sedikit kehancuran ketika sistem membaca dan menulis data.
sumber
/r
saklar, maka seperti yang saya jelaskan, itu akan mencoba untuk menghitung semua file. Jika Anda menggunakan/d
switch, itu hanya menyebutkan folder di direktori saat ini, jadi kecuali Anda memiliki satu miliar folder di direktori saat ini, itu seharusnya tidak menyebabkan masalah.Saya tidak dapat berbicara dengan triliunan file, tetapi baru-baru ini saya nuked share file lama yang berisi ~ 1,8 juta file menggunakan:
"EmptyTMPFolder" adalah direktori lokal kosong. opsi / MIR akan membuat target terlihat seperti sumber (kosong).
Manfaat nyata untuk pendekatan ini adalah opsi coba lagi (/ R: 30). Ini memungkinkan kesempatan untuk menyerap masalah konektivitas apa pun yang mungkin terjadi selama proses ini. Penghapusan lokal mungkin tidak menemukan manfaat dalam pendekatan ini.
Saya tidak memiliki tolok ukur khusus untuk membandingkan waktu, tapi saya lebih suka ini daripada beberapa opsi lain yang disarankan b / c dari coba lagi / menunggu opsi. Penghapusan mulai dekat secara instan.
sumber
Untuk menghapus semua folder akan memakan waktu lama, dan tidak banyak yang dapat Anda lakukan. Yang dapat Anda lakukan adalah menyimpan data Anda, dan memformat drive Anda. Ini tidak optimal, tetapi akan berhasil (dan cepat).
Pilihan lain mungkin menggunakan distro linux pada live CD yang dapat membaca dari partisi NTFS. Saya tahu dari pengalaman pribadi yang
rm -rf folderName
dapat berjalan setidaknya 2 hari tanpa menabrak sistem dengan 2GB RAM. Ini akan membutuhkan waktu, tetapi setidaknya akan selesai.sumber
Mm .. Saya tidak ingin tahu bagaimana Anda membuat begitu banyak.
Apa yang terjadi adalah Explorer mencoba menghitung setiap file, dan menyimpan informasi dalam memori, sebelum mulai dihapus. Dan jelas ada terlalu banyak.
Sudahkah Anda mencoba perintahnya
rmdir /s
? Selama itu benar-benar menghapus file karena mereka ditemukan daripada menunggu setiap orang untuk disebutkan, itu mungkin berhasil.Ada berapa level subdirektori? Jika hanya ada satu, atau beberapa angka rendah lainnya, maka file batch cepat yang secara manual berulang dapat bekerja.
Metode apa pun akan memakan waktu cukup lama.
sumber
rm -rf
dilakukannya. Itu bekerja paling baik dengan struktur direktori yang relatif dangkal. Saya tidak yakin apakahrmdir /s
ini. Ini seharusnya .rmdir /?
:/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
Dengan kata lain,/s
flag juga menghapus file. Bagaimana Anda menggunakannyadel
? Dan ya, mungkin lebih baik hanya menggunakanrm -rf
seperti yang disarankan soando.Salah satu kemungkinan penyebab masalah seperti ini adalah penyediaan tipis, biasanya ditemukan di lingkungan SAN. Beberapa solid-state drive mungkin menunjukkan masalah yang sama. Jika ini masalahnya, perubahan konfigurasi ini dapat menyelesaikan masalah Anda:
Perhatikan bahwa perubahan ini dapat memengaruhi kinerja pada solid state drive, dan dapat mencegah pemasangan kembali otomatis dan / atau manual drive SAN.
sumber
Shift+ Deletemelewatkan Recycle Bin, dan mungkin mempercepat banyak hal.
Jika itu tidak berhasil (kasus ekstrim), coba Fast Folder Eraser dan / atau Mass Directory Eraser
sumber
Mungkin antivirus / antimalware Anda menghabiskan semua memori dan kemudian men-crash sistem.
Windows itu sendiri tidak memiliki masalah menghapus sejumlah besar file, meskipun tentu saja lebih lambat daripada operasi serupa di kebanyakan sistem file non-Microsoft.
sumber
Masalah yang mungkin Anda temui adalah direktori tersebut tidak dapat dipadatkan ketika Anda menghapus file / folder, jadi jika Anda memiliki folder dengan 1 juta file di dalamnya dan menghapus 500k pertama dari mereka. Ada satu ton blok di awal direktori Anda yang untuk semua maksud kosong.
TETAPI, explorer dan prompt perintah masih harus melihat melalui blok-blok itu kalau-kalau ada file di sana. Sesuatu yang mungkin bisa membantu adalah "memindahkan" folder dari suatu tempat ke bawah pohon ke folder baru dari dasar drive, kemudian hapus folder baru itu. Memindahkan folder hanya akan memindahkan pointer ke folder sehingga harus pergi dengan cepat dan tidak benar-benar memindahkan semua file di bawahnya ke ruang baru di drive.
Hal lain yang dapat Anda coba adalah menggunakan alat pihak ke-3 seperti "PerfectDisk" ke folder Compact setelah menghapus banyak file.
sumber
Mencoba berbagai pendekatan untuk menghapus lebih dari 10 juta file log fusi, saya perhatikan sekitar 30 ribu file rata-rata dapat dihapus selama periode 10 menit. Itu akan memakan waktu sekitar 55 jam untuk 10 juta file ...
Menggunakan skrip di bawah ini, tingkat penghapusan meningkat ~ 75%. Daftar file dibuat dan dieksekusi oleh proses bersamaan meningkatkan operasi disk (tetapi tidak secara linear.) Saya menunjukkan 4 garpu, tetapi dua mungkin cukup.
Ada opsi untuk menggunakan PowerShell yang secara signifikan mengurangi waktu yang diperlukan untuk menyiapkan daftar.
BTW, saya diuji menggunakan dua operasi del langsung yang memungkinkan untuk tabrakan, tetapi tidak ada pengurangan nyata dalam waktu penghapusan keseluruhan dibandingkan dengan operasi del tunggal. Dan sementara itu mungkin tidak diinginkan untuk membuat daftar hapus, waktu yang dihemat tidak sia-sia.
sumber
Coba ini, dan ubah sesuai kebutuhan ..
Ini adalah skrip yang diuji pada Win2003 berdasarkan Penjelasan Teknis dan Analisis Synetech menjawab 15 Okt '13 pada 15:22
Testrun .. Ada folder seperti A1 ke A4, B1 ke B4 dan C1 ke C4 bersarang secara berbeda ..
Saya tidak dapat berkomentar (situs mengeluh tentang reputasi saya), jadi saya menambahkan komentar saya di sini ..
Solusi Bjv menciptakan filelist sementara yang tidak berguna. Dan kemudian mengulangi mereka kedua kalinya untuk melakukan pekerjaan yang sebenarnya. /superuser//a/892412/528695
Script Synetech asli tidak berfungsi untuk saya. /superuser//a/416469/528695
Hasil ..
sumber
Saya memiliki masalah serupa waktu yang lalu dengan hanya 10 juta file tetapi di server 2003, untuk menghapus file saya menggunakan server ftp / klien, dan meninggalkan klien menghapus file dan folder. Ini solusi yang lambat tetapi bekerja dengan sempurna.
Mungkin Anda akan memiliki masalah kedua dengan MFT di NTFS yang tidak memiliki solusi, MFT adalah array yang di win 2003 (saya tidak yakin apakah Microsoft punya solusi setelah win 2003) menyimpan semua file dengan cara tambahan sehingga dengan triliun file ukurannya akan menjadi gila, dalam kasus saya MFT memiliki 17 juta catatan dan ukuran MFT sekitar 19GB dengan hanya 45.000 file, saya menguji dalam sistem lain dan sepertinya 1 juta catatan, MFT akan sekitar 1 GB.
Anda dapat memeriksa status MFT dengan perintah ini:
C:
- surat satuan/a
- menganalisis/v
- verboseSolusi rumit lain, karena tidak ada alat yang dapat mengecilkan MFT, alat hanya mengisi 0 nama file dan properti tetapi tidak lebih, tetapi Anda dapat menggunakan VMware converter atau jenis lain dari P2V dan membuat mesin virtual berdasarkan server Anda, dengan cara itu Anda akan memperbaiki semua masalah yang berkaitan dengan MFT, saya tidak pernah menguji konversi dari V2P, sekarang saya hanya bekerja di lingkungan virtual, tapi saya melihat banyak info tentang itu di internet.
Kemenangan 2003 itu berfungsi dengan baik sekarang, ukuran MFT adalah 40MB dan semuanya baik-baik saja, jika Anda mau, saya dapat memberi tahu Anda lebih banyak tentang pencadangan, defrag, atau tugas lain yang terkait dengan jutaan file kecil.
sumber
Per jawaban ini di StackOverflow menggunakan kombinasi dari
del
danrmdir
:sumber
Karena menghapus file sekaligus menggunakan terlalu banyak memori, Anda memerlukan cara untuk menghapusnya satu per satu, tetapi dengan proses otomatis. Hal semacam ini jauh lebih mudah dilakukan di shell bergaya Unix, jadi mari kita gunakan Cygwin. Perintah berikut menghasilkan daftar file biasa, mengubah daftar itu menjadi urutan
rm
perintah, lalu mengumpankan skrip yang dihasilkan ke shell.Script sedang dieksekusi bahkan ketika sedang dibuat, dan tidak ada loop, jadi shell tidak (semoga) harus membuat file temp besar. Ini tentu akan memakan waktu cukup lama, karena naskahnya panjangnya jutaan baris. Anda mungkin harus mengubah
rm
perintah (mungkin saya seharusnya menggunakan-f
? Tetapi Anda memahami file Anda lebih baik dari saya) untuk membuatnya berfungsi.Sekarang Anda tidak memiliki apa-apa selain direktori. Di sinilah semuanya dicy. Mungkin Anda telah menghapus cukup file sehingga Anda dapat melakukannya
rm -rf
tanpa kehabisan memori (dan mungkin akan lebih cepat daripada skrip lain). Jika tidak, kami dapat mengadaptasi jawaban Stackoverflow ini :Sekali lagi, penyesuaian mungkin diperlukan, kali ini dengan
sort
, untuk menghindari membuat file temp besar.sumber
Saya mengalami masalah yang sama beberapa waktu lalu. Saya menulis sebuah utilitas kecil yang melakukan hal itu: menghapus direktori secara rekursif. Itu tidak akan menghitung file, dan tidak akan mengkonsumsi banyak memori (O (n + m) di max dengan n = kedalaman direktori maksimum dan m = jumlah file / direktori maksimum di salah satu subdirs). Itu dapat menangani file-file panjang (> 256 karakter). Saya ingin mendapatkan umpan balik jika Anda dapat menyelesaikan masalah Anda dengan ini.
Anda dapat menemukannya di sini: https://github.com/McNetic/fdeltree (dapat dieksekusi di folder rilis)
sumber
Saya menemukan utas ini mencari cara yang lebih baik daripada yang saya miliki untuk menghapus lebih dari 3 juta file di beberapa server yang saya dukung. Di atas adalah cara IMO rumit jadi saya akhirnya menggunakan metode saya yang dikenal menggunakan alat baris perintah "FORFILES" di Windows (ini pada Server 2003).
Lagi pula, di bawah ini adalah perintah FORFILES yang saya gunakan untuk menghapus SEMUA file dalam folder dari baris perintah.
forfiles / P "JALAN FOLDER ANDA DI SINI (mis. C: \ Windows \ Temp)" / C "cmd / c echo @file & del / f / q @file"
Di atas juga ECHO nama file yang sedang dihapus ke layar, tetapi hanya karena saya ingin melihat beberapa kemajuan itu benar-benar melakukan sesuatu, jika Anda tidak menggemakan sesuatu itu hanya terlihat seperti kotak DOS telah digantung, bahkan meskipun itu melakukan pekerjaan OK seperti yang diharapkan.
Butuh beberapa saat untuk memulai, yaitu sepertinya tidak melakukan apa-apa untuk sementara waktu (sekitar 30m untuk ~ 3 juta file) tetapi pada akhirnya Anda akan melihat nama file mulai muncul ketika mereka dihapus. Metode ini juga membutuhkan waktu lama untuk menghapus file (waktu penghapusan mungkin dikurangi tanpa gema?), Tetapi tidak akhirnya bekerja tanpa menabrak mesin, pada forfiles server saya menggunakan ~ 1,850Kb memori selama proses penghapusan .. .
Durasi untuk penghapusan dapat menyebabkan masalah jika server Anda memiliki logoff otomatis karena Anda perlu terus bergerak mouse (saya akan merekomendasikan berjalan sebagai pengguna Konsol, atau melalui alat bagian ke-3 seperti LanDesk atau SCCM dll. (Atau MouseJiggle. exe))
Ngomong-ngomong, kupikir aku akan membagikan jawabanku, semoga sukses semuanya!
sumber