Масове видалення файлів у Windows


141

У мене є каталог, який містить ~ 3 мільйони файлів у певних підкаталогах на сервері Windows 2008. Видалення файлів вручну через SHIFT + DEL у кореневому режимі займає багато років. Чи є інший спосіб зробити швидше видалення ?


1
Також запитують тут, у "Переповнення стека": stackoverflow.com/questions/186737/…
Гюго

6
Як я міг націлити магніт лише на деякі підкаталоги?
Хайме Габлуцель

7
@Jaime Постійною рукою, як справжній програміст ... ;-) xkcd.com/378
Legionair

Що робити, якщо це SSD Drive?
Бенджамін Вайс

Відповіді:


179

ПОПЕРЕДЖЕННЯ: якщо у вас є посилання на каталоги, delви видалите фактичні каталоги, а не символьні посилання. Будьте дуже обережні з цим і не запускайте ці команди, якщо ви не знаєте, що в каталозі цілі немає посилань.


Мені регулярно потрібно видаляти багато файлів і каталогів із зашифрованого накопичувача WinXP, як правило, близько 22 ГБ з 500 000 файлів у 45 000 папок.

Видалення за допомогою Провідника Windows - це сміття, оскільки воно витрачає багато часу на перерахування файлів. Зазвичай я переміщую речі, які мені потрібно видалити, на C: \ stufftodelete і маю пакетний файл deletestuff.bat rmdir /s/q C:\stufftodelete. Це планується запустити вночі, але іноді мені потрібно запустити його вдень, тим швидше, тим краще.

Ось результати тесту на швидкий час невеликого 5,85 МБ зразка з 960 файлів у 303 папках. Я запустив метод 1, а потім спосіб 2, а потім скинув тестові каталоги.

Спосіб 1 видаляє файли та структуру каталогів за один прохід:

rmdir /s/q foldername

Спосіб 2 має перший пропуск для видалення файлів і виведення на нуль, щоб уникнути накладних витрат на екран для кожного окремого файлу. Потім другий прохід очищає решту структури каталогів:

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 секунди

Ось результати іншого тесту з використанням 404 МБ з 19 521 файлів у 3 243 папках:

  • Спосіб 1: 2 хвилини 20 секунд
  • Спосіб 2: 2 хвилини 33 секунди

Так що в ньому не так багато, напевно, занадто близько, щоб судити про один тест.


Редагувати: я перевірив значно більше даних, це типовий для мене випадок: 28,3 ГБ із 1159 211 файлів у 146 918 папках:

  • Спосіб 1: 2h 15m, 2h 34m: середній: 2 години 25 хвилин
  • Спосіб 2: 49м, 57м: середній: 53 хвилини

Нічого собі, метод 2 майже втричі швидший, ніж метод 1! Я буду оновлювати свою deletestuff.bat!


RD / S / Q чудово працює, якщо ви вказуєте абсолютний шлях, але він не працює при відносних шляхах. Чи є рішення?
Майкл С.

1
@Hugo: Гюго, питання: У вищезазначених тестах, для одного або обох методів, ви рахували файли безпосередньо перед запуском методу? Я запитую, оскільки вміст папки може бути вже в кеші файлів ОС. Дякую!
Вільям С

@WilliamC: Я точно не пам’ятаю, але для повторних видалень з тим самим вмістом я підрахував би безпосередньо перед одним видаленням, а для інших видалених не повторив би їх (як я вже знав номери).
Гюго

1
Як rmdir, так і del виходять з ладу, якщо в ньому задіяні імена, що перевищують 256 символів.
Ніколай Ехман

1
ПОПЕРЕДЖЕННЯ: якщо у вас є посилання на каталоги, delви видалите фактичні каталоги, а не символьні посилання. Будьте дуже обережні з цим і не запускайте ці команди, якщо ви не знаєте, що в каталозі цілі немає посилань.
користувач0103

18

Якщо вам доведеться регулярно видаляти великі дерева каталогів, подумайте про збереження кореня дерева цього каталогу на окремому розділі, а потім просто швидко відформатувати його, коли потрібно видалити все. Якщо вам потрібно автоматизувати це, ви можете використовувати цю команду DOS:

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

де Z: - ваша "летюча" перегородка. Примітка: на розділі не повинно бути ярликів. Я тут про це блогував .


І використовуйте жорстке посилання, щоб створити з'єднання між диском і каталогом, де зберігаються файли, якщо потрібен точний шлях до каталогу.
Хмара Німе

1
@NimeCloud: жорсткі посилання не можуть перетинати файлові системи чи посилання на каталоги.
grawity

5
Однак символьні посилання можуть перетинати файлові системи та каталоги посилань, тому вони можуть бути доречними тут. Дивіться команду mklink (Vista та пізніші версії; в іншому випадку використовуйте з'єднання від Марка Русиновича / SysInternals.)
Роберт Калхун

9

У командному рядку (Пуск -> Виконати -> cmd):

del /f /s /q foldername 

Це чудово, тому що в ньому перераховано те, що його видалення .., але це те саме, що і rd за швидкістю.
бобобо

1
Ой, ой, ой, ой. Не так добре, як я думав. Він швидко видаляє файли, але залишає дерево директорії недоторканим.
бобобобо

1
Що я можу додати, потрібно досить багато часу, щоб очистити за допомогою rd.
бобобо

3
@bobobobo Я зробив кілька тестів з ~ 30 ГБ / 1 000 000 файлів / 15 000 папок і del + rd майже втричі швидше, ніж просто rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo

1
Це не вдасться, якщо ім'я шляху не перевищує 256 символів.
Микола Ехман

7

Крім копіювання / переміщення файлів дуже швидко (використовуючи власний API), TeraCopy може видаляти файли, і це дуже швидко. З моменту з'ясування TeraCopy я не використовую комп'ютер без його встановлення (якщо я буду копіювати / переміщувати / видаляти).

Цей же інсталятор встановлює видання x64, але щоб використовувати його, потрібно вручну змусити його.

Бета-версія, яку я рекомендую для стабільних версій: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


Ви коли-небудь робили чи бачили подібні порівняння часу TeraCopy з rmdir або del або del + rmdir?
Гюго

1
@Hugo: Дурне питання. Я б не рекомендував TeraCopy, якби його не було помітно простим оком, це швидше!
rautamiekka

5
Тож ви оцінюєте, що це на 10% швидше? Вдвічі швидше? Вдесятеро швидше? Мільйон разів швидше? Було б чудово, якби ви могли зрівнятися з rmdir двома великими і однаковими тестовими наборами.
Гюго

1
Дякую! Я використовую TeraCopy роками, але ніколи не знав про функцію масового видалення. І ти маєш рацію, це набагато, МНОГО швидше!
AzDayton

1
@Amalgovinus Ви цього не робите. Ви або відкриєте програму і додаєте файли / папки за допомогою перетягування або клацання правою кнопкою миші або клацніть правою кнопкою миші файли / папки в Провіднику / на робочому столі. Після того, як ви закінчите їх, просто натисніть «Видалити» та «Перемістіть у кошик», якщо ви хочете, але я віддаю перевагу «Видалити з диска». Однак вам потрібно буде запустити TeraCopy як Admin, щоб визначити його, щоб відобразитися в робочому столі / Провіднику правою кнопкою миші, якщо це не зроблено за замовчуванням.
rautamiekka

6

Я зробив 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

він виконує роботу в два кроки, один, він намагається видалити файли. А друге - спробувати взяти на себе право власності на файли. y слід змінити ваш місцевий (позначати так англійською). Якщо не вдасться виконати завдання (наприклад, якщо не вдалося через дозвіл), тоді його потрібно запустити ще раз. Однак другий раунд не намагатиметься видалити файли, видалені в першому раунді, тому це може бути досить швидким.


Як ним користуватися. Збережіть як delfolder.bat у маршруті маршруту (наприклад, c: \ windows), а потім запустіть його як

 delfolder "foldername"   

де ім'я папки - це ім'я папки

У моєму тесті видалення 123'000 файлів зайняло 3 хвилини (sata 7200rpm). ТАК!


1
Зазвичай ви не повинні використовувати %1в сценарії, але "%~1". Таким чином, якщо аргумент передано з цитатами, він розписується та реквізується. Якщо вона не була передана цитатами, вона цитується.
Бенуа

4

Використання наведеного нижче коду для мене працює добре.

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

Додайте `> nul` в кінець цього виклику роботокопії, щоб не потрібно було бачити його на екрані.
JoshDM

Це схоже на використання rsyncв Linux. Це навіть швидше тут rmdir?
Hastur

FYI, ця робокопія сильно відрізняється від del /f/q/s+ rmdir /s/q. Якщо у вашого dir_to_wipe з'явилися викиди, c:\some_important_dirви втратите свої дані.
Павло П

@Pavel тоді використовувати / XJ, щоб виключити точки з'єднання та символічні посилання?
Бернхард

Це зробило трюк для каталогу в 36 ГБ, який мав сотні каталогів і файлів, що складали> 256 символів, через що "метод" del / rmdir збився. Це зайняло секунди, Windows Explorer оцінював HOURS!

3

Використовуйте команду rd / s з командного рядка.


2
Ні. Це так само повільно, як і видалення з Explorer.
bobobobo

Ну, це добре. Працює краще, ніж del / f / s / q, все одно.
бобобо

3
Ну, це набагато краще, ніж використовувати Explorer для видалення. Він продовжує видаляти, навіть якщо вилучення або два не вдасться (де Explorer задихається і перериває)
bobobobo

2

Найкраще практичне рішення - це, мабуть, переміщення папки кудись (наприклад, Кошик), а потім почати її видалення. Це пройде віками, але принаймні воно не вийде.

Я впевнений, що час, необхідний для видалення всіх цих файлів, є невід'ємною вимогою завдання, а не неефективністю в реалізації видалення.


1

Встановіть Cygwin і використовуйте rm -r . Але це, ймовірно, буде зайвим.


Це точно так само, як rd /q /s...
Joey

Забагато завдань і майже еквівалентна швидкість!
adeelx

1
Це не гірше, ніж тут відповіді на кілька інших інструментів встановлення-інструмента X-і-використання, і їх не слід проголосувати, якщо вони не є.
JdeBP

2
Чи rmсправді cygwin такий швидкий, як вбудований cmd.exe rd? Оскільки емуляція інтерфейсу posix-інтерфейсу досить повільна, тому що вимагає додаткової роботи, що rmнасправді не оцінює.
Ян Худек

Дочекавшись видалення великої колекції файлів, у мене було достатньо часу, щоб встановити Cygwin та спробувати rm -rf. Близько 10 хвилин я перервав або повернувся, del /f/s/qтому що за Cygwin використання диска становило лише 50%. Під del, використання диска прив’язано до 100%. Тому я вважаю, що його потрібно швидше видаляти. Використання процесора становить <1% для обох методів. Я не впевнений у номері файлу, тому що закрив програму видалення файлів Windows після того, як витратив на обчислення 10 хвилин.
Дерек Земба

1

Чи увімкнено генерацію коротких імен файлів? Якщо так, то вам це справді потрібно? Видалення файлу - це лише метадані. Тож якщо у вас вдвічі більше імен, які потрібно видалити, обсяг роботи значно більший.


0

Ви спробували будь-яке з цих двох додатків?

Обов'язково встановіть кількість перезаписів на 0, якщо ви хочете, щоб швидше було виконано. Зробіть це, натиснувши параметри, а потім змініть значення в нижній частині діалогового вікна.

Введіть шлях до видалення у поле Джерело та натисніть Видалити.

Ці програми не ставлять файли у кошик. Використовуйте обережно.


0

Це передбачено для компліменту та розширення кроків, зроблених у раніше згаданих відповідях.

Наведені вище два способи здаються досить ефективними, але визначити ефективність буде складно, якщо вони не будуть відповідати точно таким же умовам:

  • Пристрій і модель фізичного жорсткого диска
    • Переважно, ATTO / Crystal Disk орієнтується перед клонуванням даних про них
  • Місце розташування та геометрія тієї ж секції / об’єму
    • Способом зробити це - дефрагментація зразкових розділів / папок та їх клонування саме так, як вони є 2-ма тими ж типом жорстких дисків (з попереднього кроку)
  • Потім виконайте конфігурації за допомогою пакетного файлу та використовуйте Powershell Cmdlet для реєстрації та вимірювання їх продуктивності.

    • В ідеалі слід додати деякі механізми, щоб запобігти будь-які упередження кешування через сприйняття подібної активності.
  • Нижче наведено кілька зразків папок (названих як загальний розмір), над якими я експериментував, але не зміг отримати будь-які переконливі показники / результати.

р.бат

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Я б розмістив вихідні файли журналу, але я вважаю, що дисперсія величезна через розміри та розподіл файлів папок тощо.

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

виходить з імені> 256 символів

0

Відповідь від Hugo найшвидший, але він не видаляє приховані або системні файли з першого проходу, тому, якщо ви хочете більш повного рішення, використовуйте параметр / a:

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

Щодо файлу BAT від Magallanes , будьте дуже обережні з поглинанням та icacls, викликайте жорсткі посилання, які мають однакові дозволи та власники, тому якщо в папці, яку ви хочете видалити, є ненасичені тверді посилання, використовуючи takeown та icacls, ви зміните дозволи та власники файлів поза папку.

Використовуючи інструмент ln.exe, ви можете перелічити всі файли з твердою посиланням всередині папки та знати, чи є вони жорсткими посиланнями на файли поза папкою (ненасичені тверді посилання):

ln.exe --enum foldername > HardlinksList.txt

-1

Видалення папки швидше, ніж видалення декількох файлів.

Тож якщо ви віддаєте перевагу використовувати миш замість командного рядка, ви можете створити каталог, перемістити файли туди і видалити його (як ви вже сказали Shift + Del).


2
Каталог повинен бути створений на тому ж розділі, де містяться файли. Це зробить дії переміщення миттєвими. Якщо нова папка та файли знаходяться на окремих розділах, то вся операція копіювання триватиме багато.

5
Звідки у вас ідея, що видалення папки швидше, ніж видалення файлів всередині? Видалення папки містить перший крок для видалення всіх файлів у цій папці, тому швидше не може бути. Переїзд до кошика - це зовсім інша справа, але тут справа не в цьому.
Джої
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.