2009-08-07 07:00:33 +0000 2009-08-07 07:00:33 +0000
142
142

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

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

Ответы (14)

180
180
180
2011-05-27 11:27:41 +0000

Предупреждение: если у вас есть сим-ссылки на каталоги, то del удалит действительные каталоги, а не сим-ссылки. Будьте очень осторожны с этим и не запускайте эти команды, если вы не знаете, что внутри целевой директории нет никаких симлинков.


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

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

Вот результаты быстрого теста времени маленького 5.85 MB образца из 960 файлов в 303 папках. Я запустил метод 1, затем метод 2, а затем сбросил тестовые каталоги.

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

rmdir /s/q foldername

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

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 файла в 3 243 папках:

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

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


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

  • Метод 1: 2h 15m, 2h 34m: средний: 2 часа 25 минут
  • Метод 2: 49м, 57м: в среднем: 53 минуты 0x2 и 0x2 и - Ух ты, метод 2 почти в три раза быстрее, чем метод 1! Я буду обновлять свои deletestuffff.bat!
18
18
18
2011-10-31 06:37:53 +0000

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

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

где Z: является вашим ‘нестабильным’ разделом. Замечание: раздел не должен иметь метки. Я написал об этом в блоге здесь .

9
9
9
2009-08-07 07:07:04 +0000

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

del /f /s /q foldername
7
7
7
2011-05-25 14:00:51 +0000

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

Одна и та же программа установки устанавливает версию x64, но для использования ее нужно вручную форсировать.

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

6
6
6
2012-02-09 17:35:24 +0000

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

@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 минуты (сота 7200rpm). ГАЙ!

4
4
4
2011-12-23 15:47:15 +0000

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

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
3
3
3
2009-08-07 07:09:35 +0000

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

2
2
2
2009-10-06 21:59:15 +0000

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

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

1
1
1
2009-10-06 23:45:48 +0000

Установите Cygwin и используйте rm -r. Но это, скорее всего, перебор.

1
1
1
2011-05-31 12:40:36 +0000
0
0
0
2017-12-13 19:46:11 +0000

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

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

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

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

ln.exe --enum foldername > HardlinksList.txt
```.
0
0
0
2010-04-03 16:30:58 +0000
0
0
0
2017-06-15 12:00:52 +0000

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

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

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

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

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
-1
-1
-1
2009-08-07 07:13:28 +0000

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

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

Похожие вопросы

3
19
10
28
7