У меня есть каталог, который содержит ~ 3 миллиона файлов в определенных подкаталогах на сервере Windows 2008. Удаление файлов вручную с помощью клавиш SHIFT+DEL в корневом каталоге занимает много времени. Есть ли другой способ сделать удаление более быстрым способом?
14 ответов
Мне регулярно нужно удалять множество файлов и каталогов с зашифрованного диска 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!
Если вам приходится регулярно удалять большие деревья каталогов, рассмотрите возможность хранения корня этого дерева каталогов в отдельном разделе, а затем просто быстро отформатируйте его, когда вам нужно все удалить. Если вам нужно автоматизировать это, вы можете использовать эту команду DOS:
echo Y | format Z: /FS:NTFS /X /Q
где Z: ваш «изменчивый» раздел. Примечание: раздел не должен иметь метки. Я писал об этом здесь.
В командной строке (Пуск -> Выполнить -> cmd
):
del /f /s /q foldername
В дополнение к очень быстрому копированию / перемещению файлов (используя собственный API), TeraCopy может удалять файлы, и это очень быстро. С тех пор, как я обнаружил TeraCopy, я не использую компьютер без установленного (если я собираюсь скопировать / переместить / удалить).
Тот же установщик устанавливает версию x64, но чтобы использовать ее, нужно вручную ее принудительно установить.
Бета-версия, которую я рекомендую для стабильных версий: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/
Я сделал файл летучей мыши, который делает то же самое.
@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). УРА!
Используйте команду rd /s из командной строки.
Использование кода ниже обычно работает хорошо для меня.
mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
Лучшее практическое решение, вероятно, состоит в том, чтобы убрать папку куда-нибудь (например, в корзину) и затем начать ее удаление. Это займет целую вечность, но по крайней мере это будет в стороне.
Я почти уверен, что время, необходимое для удаления всех этих файлов, является неотъемлемым требованием задачи, а не неэффективностью в реализации удаления.
Установите Cygwin и используйте rm -r. Но это может быть излишним.
У вас включено создание коротких имен файлов? Если это так, вам это действительно нужно? Удаление файла - только операция метаданных. Так что если вам нужно удвоить количество имен для удаления, объем работы значительно выше.
Вы пробовали любое из этих двух приложений?
Обязательно установите количество перезаписей равным 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
Ответ от 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
Удаление папки происходит быстрее, чем удаление нескольких файлов.
Поэтому, если вы предпочитаете использовать мышь вместо командной строки, вы можете создать каталог, переместить туда файлы и удалить его (как вы сказали, Shift+Del).