134

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

14 ответов14

171

Мне регулярно нужно удалять множество файлов и каталогов с зашифрованного диска 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 имеет первый проход для удаления файлов и выводит значение 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!

17

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

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

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

9

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

del /f /s /q foldername 
6

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

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

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

6

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

@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

он выполняет работу в два этапа, один, он пытается удалить файлы. И второе - попытаться завладеть файлами. у должен быть изменен в соответствии с вашим местным (обозначать «да» на английском языке). Если выполнить задачу не удалось (например, если произошел сбой из-за разрешения), вы должны запустить ее снова. Тем не менее, второй раунд не будет пытаться удалить файлы, удаленные в первом раунде, поэтому это может быть довольно быстро.


Как это использовать. Сохраните файл delfolder.bat в пути маршрута (например, c:\windows), затем запустите его как

 delfolder "foldername"   

где foldername - имя папки

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

3

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

3

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

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

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

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

1

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

1

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

0

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

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

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

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

0

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

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

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

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

r.bat

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

Ответ от 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
-1

Удаление папки происходит быстрее, чем удаление нескольких файлов.

Поэтому, если вы предпочитаете использовать мышь вместо командной строки, вы можете создать каталог, переместить туда файлы и удалить его (как вы сказали, Shift+Del).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .