Cara menghapus sejumlah besar file di Windows

22

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 delatau 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:

  1. Tidak masalah menggunakan Windows Explorer, DELdari command prompt, atau rmperintah Cygwin , memori Sistem secara bertahap turun ke nol, dan kotak akhirnya akan crash.

  2. 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.

Jackey Cheung
sumber
Jadi masalah utama Anda adalah kenyataan bahwa direktori dan subdirektori tidak dihapus?
Sandeep Bansal
@ Jackey Cheung: versi windows yang Anda gunakan?
Siva Charan
1
Anda dapat menulis skrip kumpulan yang secara berulang menghapus file, tidak dimulai dari tingkat atas tetapi pada misalnya tingkat kelima dari struktur folder. Itu akan membagi pekerjaan menjadi banyak 'rm's
9
Saya harus tahu, bagaimana Anda mendapatkan satu triliun file, sungguh ...
Moab
2
Satu triliun file membutuhkan tabel file yaitu 1 PB. Hard disk terbesar saat ini adalah beberapa TB. Bagaimana Anda bisa mendapatkan partisi sebesar itu?
user541686

Jawaban:

10

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):

struct FILELIST {                   // Total size is 264 to 528 bytes:
  TCHAR         name[MAX_PATH];     // MAX_PATH=260; TCHAR=1 or 2 bytes
  FILELIST*     nextfile;           // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}

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.

@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"

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 /rsakelar alih-alih menggunakan rekursi (manual). Itu tidak akan berhasil karena ketika /rswitch 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 = 400direktori 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.

Synetech
sumber
Saya cukup yakin ini tidak berhasil. Saya sudah mencobanya. Masalahnya terletak pada loop FOR. Ternyata FOR akan menyebabkan masalah yang sama dengan mengeluarkan DEL secara langsung.
Jackey Cheung
1
Tergantung pada switch yang Anda gunakan. Jika Anda menggunakan /rsaklar, 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.
Synetech
7

Saya tidak dapat berbicara dengan triliunan file, tetapi baru-baru ini saya nuked share file lama yang berisi ~ 1,8 juta file menggunakan:

robocopy EmptyTMPFolder FolderToDelete /MIR /MT:16 /ETA /R:30 /W:5

"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.

matt.bungard
sumber
Saya menemukan bahwa ini adalah metode yang paling efisien ketika menjalankan pembersihan pada pohon folder drive jaringan besar. Terima kasih atas tipnya.
Tonny
5

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 folderNamedapat berjalan setidaknya 2 hari tanpa menabrak sistem dengan 2GB RAM. Ini akan membutuhkan waktu, tetapi setidaknya akan selesai.

soando
sumber
1
hm, Linux. Saya berpikir tentang Cygwin. Meskipun itu seharusnya menggunakan fungsi menggarisbawahi Windows, hanya bertanya-tanya apakah itu akan membuat perbedaan dalam kasus ini. Saya akan mencobanya.
Jackey Cheung
1
Anda dapat menggunakan git bash
raindrop
4

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.

Bob
sumber
Selain saran Soando untuk format ulang, tentu saja. Itu akan cepat, tetapi jika ini adalah drive sistem Anda, Anda harus menginstal ulang Windows.
Bob
Saya cukup yakin bahwa enumerasi harus dilakukan, supaya program tahu apa yang harus dihapus selanjutnya. rmdir tidak dapat menghapus file seperti yang ditemukan, karena dimulai dari atas, dan harus melintasi entah bagaimana. Satu-satunya pertanyaan adalah berapa banyak kelebihan informasi yang disimpannya.
soandos
@soandos Explorer menghitung setiap file. Saya sedang memikirkan beberapa metode yang menerapkan gaya enumerasi DFS: pergi sejauh mungkin ke cabang, menghapus ketika hits file, sebelum kembali ke atas. Dengan kata lain, rekursi, itulah yang rm -rfdilakukannya. Itu bekerja paling baik dengan struktur direktori yang relatif dangkal. Saya tidak yakin apakah rmdir /sini. Ini seharusnya .
Bob
1
@JackeyCheung 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, /sflag juga menghapus file. Bagaimana Anda menggunakannya del? Dan ya, mungkin lebih baik hanya menggunakan rm -rfseperti yang disarankan soando.
Bob
1
@JackeyCheung: Anda salah. Jika Anda memberi rmdir tanda / s, itu menghapus file dan juga direktori.
Harry Johnston
4

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:

fsutil behavior set DisableDeleteNotify 1

Perhatikan bahwa perubahan ini dapat memengaruhi kinerja pada solid state drive, dan dapat mencegah pemasangan kembali otomatis dan / atau manual drive SAN.

Harry Johnston
sumber
3

Shift+ Deletemelewatkan Recycle Bin, dan mungkin mempercepat banyak hal.

Jika itu tidak berhasil (kasus ekstrim), coba Fast Folder Eraser dan / atau Mass Directory Eraser

Tamara Wijsman
sumber
ketika saya mencoba untuk menghapus sejumlah besar file gambar, ya Shift DEL cukup cepat jika dibandingkan dengan DEL normal, terima kasih
V-SHY
3

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.

Ben Voigt
sumber
Poin yang bagus! Tentu layak untuk dilihat.
Jackey Cheung
Saya sudah mematikan antivirus, dan memori masih dimakan seperti sebelumnya.
Jackey Cheung
Mematikan antivirus tidak membantu membebaskan memori setelah proses dihentikan.
Jackey Cheung
@JackeyCheung: Program antivirus apa itu? Beberapa tidak benar-benar mati sepenuhnya ...
Ben Voigt
2

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.

Kelly
sumber
2

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.

@ECHO OFF
SETLOCAL EnableDelayedExpansion

IF /I "%~1"=="timestamp" (
    CALL :ECHOTIMESTAMP
    GOTO END
)

rem directory structure to delete
SET "DELETE=c:\_delete\Content.IE5\???<<<change this>>>???"
rem primary list of discovered files to delete
SET "LIST=delete-list.txt"
rem base path for sub-lists
SET "LISTBASE=.\delete-list"
SET "TITLE=Batch Delete Process"
rem specifies number of batch delete processes to spawn
SET FORKS=4
rem when set to 1, use PowerShell for list building and delete.  Definitely improves time to build fork sublists
SET POWERSHELL=0
rem specifies max files to delete when greater than 0
SET MAXDEL=1000000

rem prompt for confirmatoin
SET /P CONT=About to delete all files and directories from !DELETE!. Continue (Y/N)?
IF /I NOT "!CONT!"=="Y" EXIT /B

CALL :ECHOTIMESTAMP

ECHO Accumulating list of files to delete...
dir /b /s "!DELETE!" > "!LIST!"

FOR /F "delims=" %%c IN ('type "!LIST!" ^| find /C ":"') DO SET "COUNT=%%c"
ECHO Discoverd !COUNT! files and directories to delete.

IF  %MAXDEL% GTR 0 IF !COUNT! GTR %MAXDEL% (
    SET COUNT=%MAXDEL%
    ECHO Limiting files/directories deletion count to  !COUNT!
)

CALL :ECHOTIMESTAMP
ECHO Preparing !FORKS! delete processes...
SET /A LIMIT=!COUNT!/!FORKS!

IF !POWERSHELL! EQU 1 (
    SET SKIP=0
    FOR /L %%n IN (1,1,!FORKS!) DO (
        SET "CURRENT=!LISTBASE!-%%n.txt"
        SET "LIST[%%n]=!CURRENT!"
        DEL /f /q "!CURRENT!" > nul 2>&1
        IF %%n EQU !FORKS! SET /A LIMIT+=!FORKS!
        SET CMD=type \"!LIST!\" ^| select -first !LIMIT! -skip !SKIP!
        powershell -command "& {!CMD!}" > "!CURRENT!"
        SET /A SKIP+=!LIMIT!
    )

) ELSE (
    rem significantly slower but no PowerShell.
    SET L=1
    SET N=!LIMIT!
    SET C=0
    FOR /F %%f  IN (!LIST!) DO (
        IF !C! LSS !COUNT! (
            IF !N! GEQ !LIMIT! (
                SET "CURRENT=!LISTBASE!-!L!.txt"
                SET "LIST[!L!]=!CURRENT!"
                DEL /f /q "!CURRENT!" > nul 2>&1
                SET /A L+=1
                SET /A N=0
            ) ELSE (
                SET /A N+=1
            )
            ECHO %%f >> "!CURRENT!"
        ) ELSE (
            GOTO ENDLIST
        )
        SET /A C+=1
    )
)
:ENDLIST

CALL :ECHOTIMESTAMP
ECHO Forking !FORKS! delete processes...
FOR /L %%t IN (1,1,!FORKS!) DO (

    SET "CURRENT=!LIST[%%t]!"
    IF !POWERSHELL! EQU 1 (
        SET "TAB=        "
        SET BLANK=!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!
        SET BLANK=!BLANK!!BLANK!!BLANK!!BLANK!
        SET DEL_CMD=del -force -recurse -ea SilentlyContinue -path \"$_\"
        SET $W_CMD=$w=$Host.UI.RawUI.WindowSize.Width
        SET $S_CMD=$s=\"$_\";$i=[math]::max^(0,$s.length-$w^);$s=$s.substring^($i, $s.length-$i^);$s=\"$s !BLANK!\";$s=$s.substring^(0,[math]::min($w,$s.length^)^)
        SET ECHO_CMD=Write-Host \"`r$s\" -NoNewLine
        SET CMD=type \"!CURRENT!\" ^| %% {!DEL_CMD!; !$W_CMD!; !$S_CMD!; !ECHO_CMD!}
        SET CMD=powershell -command "^& {!CMD!}" ^& ECHO\ ^& "%~dpnx0" timestamp
        ECHO CMD !CMD!
    ) ELSE (
        SET LOOP=FOR /F %%%f IN ^(!CURRENT!^) DO
        SET OP=del "%%%f"
        SET CMD=@ECHO OFF ^&^& ^(!LOOP! !OP!  ^> nul 2^>^&1 ^)  ^& "%~dpnx0" timestamp
    )
    rem ECHO !CMD!
    START "!TITLE! %%t" cmd /k  !CMD!
)

GOTO END

:ECHOTIMESTAMP
SETLOCAL
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    ECHO !DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL
GOTO :EOF

:END
ENDLOCAL
EXIT /B
bvj
sumber
2

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

@echo off

rem ### USE FULL PATH AS FIRST ARGUMENT TO SCRIPT, DONT FORGET QUOTES !
rem ### If you move this script, fix script path variable...
SET STATICFULLSCRIPTPATH="D:\scripts\FOLDER"
SET SCRIPTNAME="DeleteFast.bat"

rem ### If CD fails or IF condition has problems,
rem ### and DEL or RMDIR runs, its better to be at safe place.
if not exist "%TEMP%\SAFE" mkdir "%TEMP%\SAFE"
if exist "%TEMP%\SAFE" cd /d "%TEMP%\SAFE"

rem ### Fix quote overflow
set var1="%1"
set var1=%var1:"=%

if not [%1]==[] (
    cd /d "%var1%"

    echo # KILLING F AT : "%var1%"
    rem ### uncomment to do damage! ### 
    rem # del /f/q * > nul

    for /d %%i in (*) do call "%STATICFULLSCRIPTPATH%\%SCRIPTNAME%" "%var1%\%%i"

    rem ## Finish deleting the last dir
    cd /d "%var1%\.."

echo # KILLING  DIR : "%var1%"
rem ## Remove dir.. first try
rmdir /q "%var1%"

if exist "%var1%" (
    rem ## Remove dir.. second try
    rem ## If thousands of files/dirs had permission/ownership problems, then prepare to wait a long time.
    rem ### uncomment to do damage! ### 
    rem #cmd.exe /c takeown /f "%var1%" && icacls "%var1%" /grant SOMEBODY:F

    rem ### uncomment to do damage! ### 
    rem #rmdir /s/q "%var1%"
)
)

cd /d "%STATICFULLSCRIPTPATH%"

Testrun .. Ada folder seperti A1 ke A4, B1 ke B4 dan C1 ke C4 bersarang secara berbeda ..

Z:\>"D:\scripts\FOLDER\DeleteFast.bat" "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS"

D:\scripts\FOLDER>

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

@echo off
if not [%1]==[] cd /d %1
echo "%1"
for /d %%i in (*) do call %0 "%%i"

Hasil ..

Z:\>C:\privscripts\TESTF\DeleteFastORIGINAL.bat "C:\privscripts\TESTF\DIRS"
""C:\privscripts\TESTF\DIRS""
""A1""
""B1""
""C1""
The system cannot find the path specified.
""B2""
The system cannot find the path specified.
""A2""
The system cannot find the path specified.
""A3""
The system cannot find the path specified.
""A4""

C:\privscripts\TESTF\DIRS\A1\B1\C1>
EO
sumber
Saya dapat memverifikasi bahwa @ user4350129 benar ketika dia mengatakan bahwa skrip Synetech tidak berfungsi - saya memiliki perilaku yang sama pada kotak Win7x64 saya.
leinad13
Sial skrip saya juga tidak sempurna, masalah dengan jika arg hilang dan penawaran meluap perintah take take anc icacls .. juga saya hanya memeriksa folder bukan file .. Saya memperbaiki masalah-masalah itu .. posting diedit, tetapi selalu menguji sebelum Anda gunakan.
EO
2

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:

defrag C: /a /v
  • C: - surat satuan
  • /a - menganalisis
  • /v - verbose

Solusi 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.

pengguna5286776117878
sumber
1

Per jawaban ini di StackOverflow menggunakan kombinasi dari deldan rmdir:

del /f/s/q foldername > nul
rmdir /s/q foldername
Geoff
sumber
Ya, saya pernah baca itu sebelumnya. Sebenarnya itu tidak membantu dalam kasus saya. Karena perintah del crash pasti.
Jackey Cheung
1

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 rmperintah, lalu mengumpankan skrip yang dihasilkan ke shell.

 find dir \! -type d | sed 's/^/rm /' | sh

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 rmperintah (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 -rftanpa kehabisan memori (dan mungkin akan lebih cepat daripada skrip lain). Jika tidak, kami dapat mengadaptasi jawaban Stackoverflow ini :

 find dir | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2 | sed 's/^/rmdir /' | sh

Sekali lagi, penyesuaian mungkin diperlukan, kali ini dengan sort, untuk menghindari membuat file temp besar.

Isaac Rabinovitch
sumber
1

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)

Nicolai Ehemann
sumber
1

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!

RatMonkey
sumber