it-swarm.xyz

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

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

138
aaginor

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

Удаление с помощью проводника Windows - это чушь, потому что перечисление файлов тратит много времени. Я обычно перемещаю материал, который мне нужно удалить, в C:\stufftodelete и имею пакетный файл deletestuff.bat в rmdir /s/q C:\stufftodelete. Запуск запланирован на ночь, но иногда мне нужно запускать его днем, поэтому чем быстрее, тем лучше.

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

Метод 1 удаляет файлы и структуру каталогов за один проход:

rmdir /s/q foldername

Метод 2 имеет первый проход для удаления файлов и выводит значение nul, чтобы избежать накладных расходов при записи на экран для каждого отдельного файла. Второй проход очищает оставшуюся структуру каталогов:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Метод 1: 17,5 с, 14,9 с, 13,9 с, 14,8 с, 13,8 с: среднее 14,98 с
  • Метод 2: 14,3 с, 12,1 с, 11,7 с, 14,2 с, 11,8 с: среднее 12,82 с

Вот результаты другого теста с использованием 404 МБ из 19 521 файла в 3243 папках:

  • Способ 1: 2 минуты 20 секунд
  • Способ 2: 2 минуты 33 секунды

Так что в этом не так много, вероятно, слишком близко, чтобы судить об одном тесте.


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

  • Метод 1: 2 ч 15 м, 2 ч 34 м: в среднем: 2 часа 25 минут
  • Метод 2: 49 м, 57 м: в среднем: 53 минуты

Вау, метод 2 почти в три раза быстрее, чем метод 1! Я буду обновлять мой deletestuff.bat!

177
Hugo

Если вам приходится регулярно удалять большие деревья каталогов, рассмотрите возможность хранения корня этого дерева каталогов в отдельном разделе, а затем просто быстро отформатируйте его, когда вам нужно все удалить. Если вам нужно автоматизировать это, вы можете использовать эту команду DOS:

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

где Z: ваш «изменчивый» раздел. Примечание: раздел не должен иметь метки. Я писал об этом здесь .

18
Mr. Bungle

В командной строке (Пуск -> Выполнить -> cmd):

del /f /s /q foldername 
9
lmsasu

В дополнение к очень быстрому копированию/перемещению файлов (используя собственный API), TeraCopy может удалять файлы, и это тоже очень быстро. С тех пор, как я обнаружил TeraCopy, я не использую компьютер без установленного (если я собираюсь скопировать/переместить/удалить).

Тот же установщик устанавливает версию x64, но для ее использования необходимо принудительно ее принудительно установить.

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

6
rautamiekka

Я сделал файл летучей мыши, который делает то же самое.

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

где foldername - это имя папки

В моем тесте удаление 123'000 файлов заняло 3 минуты (sata 7200rpm). УРА!

6
magallanes

Используйте команду rd/s из командной строки.

3
JP Alioto

Использование кода ниже обычно работает хорошо для меня.

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

Лучшее практическое решение, вероятно, состоит в том, чтобы убрать папку куда-нибудь (например, в корзину) и затем начать ее удаление. Это займет целую вечность, но по крайней мере это будет в стороне.

Я почти уверен, что время, необходимое для удаления всех этих файлов, является неотъемлемым требованием задачи, а не неэффективностью в реализации удаления.

2
Ryan Thompson

Установите Cygwin и используйте rm -r . Но это может быть излишним.

1
CarlF

У вас включена генерация коротких имен файлов? Если это так, вам это действительно нужно? Удаление файла - только операция метаданных. Так что если вам нужно удвоить количество имен для удаления, объем работы значительно выше.

1
MSalters

Вы пробовали любое из этих двух приложений?

Обязательно установите количество перезаписей равным 0, если вы хотите добиться максимальной производительности. Сделайте это, щелкнув параметры, а затем измените значение в нижней части диалогового окна.

Введите путь для удаления в поле «Источник» и нажмите «Удалить».

Эти приложения не помещают файлы в корзину. Используйте с осторожностью.

0
Stephen Kellett

Это сделано для того, чтобы дополнить и дополнить шаги, предпринятые в ранее упомянутых ответах.

Приведенные выше два метода кажутся довольно эффективными, но определить производительность будет сложно, если они не будут сопоставлены с точно такими же условиями:

  • Устройство и модель физического жесткого диска
    • Предпочтительно, чтобы ATTO/Crystal Disk тестировались перед клонированием данных на них
  • Одинаковое расположение раздела/тома и геометрия
    • Способ сделать это - дефрагментировать образец раздела/папки и клонировать их точно так же, как они представляют собой два абсолютно одинаковых типа жестких дисков (из предыдущего шага)
  • Затем выполните настройки через пакетный файл и используйте командлет Powershell для регистрации и измерения их производительности.

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

р.бат

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
0
Alex S

Ответ от Hugo самый быстрый, но он не удаляет скрытые или системные файлы при первом проходе, поэтому, если вы хотите более полное решение, используйте параметр/a:

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

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

С помощью инструмента ln.exe вы можете получить список всех файлов, жестко связанных внутри папки, и узнать, не связаны ли они с файлами вне папки (ненасыщенные жесткие ссылки):

ln.exe --enum foldername > HardlinksList.txt
0
liamZ