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

141

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

Cfinley
источник
1
Также спрашивается здесь, в переполнении стека: stackoverflow.com/questions/186737/…
Hugo
6
Как я могу нацелить магнит только на некоторые подкаталоги?
Хайме Хаблутцель
7
@Jaime С твердой рукой, как настоящий программист ... ;-) xkcd.com/378
Legionair
Что если это SSD-накопитель?
Бенджамин Вайс
Ответ для powershell: stackoverflow.com/questions/1752677/…
Воинственный шимпанзе

Ответы:

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

Хьюго
источник
RD / S / Q прекрасно работает, если вы указываете абсолютный путь, но не работает при работе с относительными путями. Есть ли решение?
Майкл С.
1
@ Хьюго: Хьюго, вопрос: В вышеупомянутых временных тестах для одного или обоих методов вы подсчитывали файлы непосредственно перед запуском метода? Я спрашиваю, потому что содержимое папки уже может быть в файловом кеше ОС. Спасибо!
Уильям C
@WilliamC: Я точно не помню, но для повторных удалений с одним и тем же содержимым я буду подсчитывать непосредственно перед только одним удалением, и не буду повторять это для других удалений (как я уже знал числа).
Хьюго
1
И rmdir, и del завершаются ошибкой, если используются пути длиной более 256 символов.
Николай Эхеманн
1
ВНИМАНИЕ: если у вас есть символические ссылки на каталоги, то delбудут удалены реальные каталоги, а не символические ссылки. Будьте очень осторожны с этим и не запускайте эти команды, если вы не знаете, что в целевом каталоге нет символических ссылок.
user0103
18

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

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

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

Мистер бангл
источник
И используйте жесткую ссылку для создания соединения между диском и каталогом, где хранятся файлы, если требуется точный путь к каталогу.
Облако
1
@NimeCloud: Жесткие ссылки не могут пересекать файловые системы или каталоги ссылок.
Гравитация
5
Однако символические ссылки могут пересекать файловые системы и каталоги ссылок, поэтому они могут быть уместны здесь. См. Команду mklink (Vista и более поздние версии; в противном случае используйте переход от Марка Руссиновича / SysInternals.)
Роберт Калхун
9

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

del /f /s /q foldername 
lmsasu
источник
Это здорово, потому что он перечисляет то, что он удаляет .. но он такой же, как и в отношении скорости.
бобобо
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/

rautamiekka
источник
Вы когда-нибудь делали или видели какие-то сравнения времени с TeraCopy против rmdir или del или del + rmdir?
Уго
1
@Hugo: глупый вопрос. Я бы не рекомендовал TeraCopy, если бы его не было видно простым глазом, он быстрее!
rautamiekka
5
Так ты оцениваешь это на 10% быстрее? В два раза быстрее? В десять раз быстрее? В миллион раз быстрее? Было бы здорово, если бы вы могли сравнить его с rmdir двумя большими и одинаковыми наборами тестов.
Хьюго
1
Спасибо! Я использую TeraCopy много лет, но никогда не знал о функции массового удаления. И ты прав, это намного, НАМНОГО быстрее!
AzDayton
1
@Amalgovinus Вы не делаете. Вы либо открываете программу и добавляете файлы / папки с помощью перетаскивания или щелчка правой кнопкой мыши, либо щелкаете правой кнопкой мыши свои файлы / папки в Проводнике / на рабочем столе. После того, как вы пройдете их, просто нажмите «Удалить» и «Переместить в корзину», если хотите, но я предпочитаю «Удалить с диска». Тем не менее, вам нужно будет загрузить TeraCopy от имени администратора, чтобы он отображался в рабочем столе / проводнике правой кнопкой мыши, если это не сделано по умолчанию.
Раутамиекка
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). УРА!

Магеллана
источник
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
Benoit
источник
Добавьте `> nul` в конец этого вызова robocopy, чтобы вам не приходилось видеть его на экране.
JoshDM
Это похоже на использование rsyncв Linux. Это даже здесь быстрее тогда rmdir?
Хастур
К вашему сведению, эта робокопия очень отличается от del /f/q/s+ rmdir /s/q. Если у вашего dir_to_wipe есть ненужные ссылки, c:\some_important_dirвы потеряете ваши данные.
Павел Р
@Pavel, затем использовать / XJ, чтобы исключить точки соединения и символические ссылки?
Бернхард
Это помогло создать каталог ~ 36 ГБ, в котором были сотни каталогов и файлов, длина которых превышала 256 символов, что приводило к сбою с ошибкой «метода» del / rmdir. Это заняло несколько секунд, Windows Explorer оценил ЧАСЫ!
3

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

JP Alioto
источник
2
Нет. Это так же медленно, как удаление из проводника.
Бобобобо
Ну, все в порядке. Работает лучше, чем Del / F / S / Q, в любом случае.
бобобо
3
Ну, это НАМНОГО лучше, чем использовать Проводник для удаления, на самом деле. Он продолжает удалять, даже если удаление или два не удастся (когда проводник захлебывается и прерывается)
bobobobo
2

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

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

Райан Томпсон
источник
1

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

CarlF
источник
Это точно так же, как rd /q /s...
Джои
Слишком много задач и почти эквивалентная скорость!
adeelx
1
Он не хуже, чем несколько других ответов install-tool-X-and-use-it, и не должен быть отвергнут, если их нет.
JdeBP
2
Действительно ли Cygwin rmтак же быстро, как встроенный cmd.exe rd? Поскольку эмуляция cygwin в интерфейсе posix довольно медленная, так как требует дополнительной работы, это rmне очень полезно.
Ян Худек
В ожидании удаления большой коллекции файлов у меня было достаточно времени, чтобы установить Cygwin и попробовать rm -rf. Примерно через 10 минут я прервал работу и вернулся к ней, del /f/s/qпотому что в Cygwin использование диска составляло только 50%. Под del, использование диска привязано на 100%. Так что я думаю, что это должно быть удаление быстрее. Загрузка ЦП <1% для обоих методов. Я не уверен в номере файла, потому что я закрыл Windows File Deleter после того, как он потратил 10 минут на вычисления.
Дерек Зимба
1

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

MSalters
источник
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
Алекс С
источник
не удается с именами> 256 символов
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
liamZ
источник
-1

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

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

danijelk
источник
2
Каталог должен быть создан в том же разделе, где находятся файлы. Это сделает действие движения мгновенным. Если новая папка и файлы находятся в отдельных разделах, то вся операция копирования будет продолжаться много.
5
Откуда вы взяли, что удаление папки происходит быстрее, чем удаление файлов внутри? Удаление папки содержит в качестве первого шага удаление всех файлов в этой папке, поэтому она не может быть быстрее. Перемещение в корзину - это совсем другое дело, но здесь вопрос не в этом.
Джои