Удаление большого количества файлов в Windows происходит медленно

34

У меня есть Windows XP с NTFS-диском, и удаление большого количества файлов происходит очень медленно. Если я выбираю папку с большим количеством файлов в дереве папок и удаляю (используя shift-del для сохранения корзины), требуется время, которое кажется прямо пропорциональным количеству файлов в папке, прежде чем оно даже всплывает окно подтверждения. Затем для удаления каждого файла в папке требуется еще больше времени.

Есть ли способ удалить папку в Windows, не затрачивая время пропорционально количеству файлов в ней?

Синдри Траустасон
источник
2
И это дубликат superuser.com/questions/19762/mass-deleting-files-in-windows
Хьюго

Ответы:

60

Есть ли способ удалить папку в Windows, не затрачивая время пропорционально количеству файлов в ней?

Я так не думаю, но некоторые методы явно намного быстрее, чем другие.

Худший способ - отправить в корзину: вам все равно нужно их удалить. Следующий худший - это Shift + Delete в Windows Explorer: он тратит кучу времени на проверку содержимого, прежде чем начать что-либо удалять.

Далее лучше всего использовать rmdir /s/q foldernameиз командной строки. del /f/s/q foldernameэто тоже хорошо, но это оставляет структуру каталогов.

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

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

Это почти в три раза быстрее, чем один rmdir, основываясь на временных тестах с зашифрованным диском Windows XP, удаляющих ~ 30 ГБ / 1 000 000 файлов / 15 000 папок: rmdirзанимает ~ 2,5 часа, del+rmdirзанимает ~ 53 минуты. Больше информации здесь .

Это обычная задача для меня, поэтому я обычно перемещаю материал, который мне нужно удалить, в C: \ stufftodelete и помещаю эти del+rmdirкоманды в командный файл deletestuff.bat. Запуск запланирован на ночь, но иногда мне нужно запускать его днем, поэтому чем быстрее, тем лучше.

Хьюго
источник
Upvote для включения> nul
Нукту
1
Windows заставит меня ждать, чтобы отсканировать многие тысячи файлов из резервной копии старого SDK. Это займет не менее часа, в моем случае это может занять 10 минут. Я поместил его в файл bat для повторного использования: gist.github.com/DavidEdwards/61d4d336232284b33b237b04da5bfe10
Кносс,
См. Также тот же ответ с дополнительной информацией на superuser.com/questions/19762/mass-deleting-files-in-windows
Warlike Chimpanzee
1

Есть ли способ удалить папку в Windows, не затрачивая время пропорционально количеству файлов в ней?

Ну да, отформатируй раздел. Я немного удивлен, что никто не предположил, что в предыдущие 9 лет.

Это довольно радикально, но если вы планируете делать это часто для определенной папки, возможно, стоит создать для нее отдельный раздел.


Если это слишком радикально, другие ответы - ваша единственная надежда. Есть хорошее объяснение, почему на сервере произошла ошибка . Это для файловых систем Linux и XFS, но здесь применяется та же логика. Вы не можете значительно улучшить встроенные функции ОС.

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

Лично мне нравятся некоторые из отчетов о проделанной работе, чтобы убедиться, что программа не умерла. Поэтому я люблю удалять вещи через Python. Например, если все файлы находятся в одном каталоге без подкаталогов:

import tqdm
import sys
import os

location = sys.argv[1]
directory = os.fsencode(location)

with os.scandir(directory) as it:
    for dir_entry in tqdm.tqdm(it):
        try:
            os.remove(dir_entry.path)
        except OSError:
            pass  # was not a file

Это удаляет около 250 файлов / с на моем 12-летнем SEAGATE ST3250620NS. Я предполагаю, что это будет намного быстрее на вашем диске.

Однако на данный момент это просто микрооптимизация, поэтому ничего не поделаешь, если у вас нет миллионов файлов в одном каталоге. (как я, LOL, что я сделал D :)

FirefoxMetzger
источник
0

Установите gnutools for windowsи запустите:

find YOURFOLDER -type d -maxdepth 3 | xargs rm -Rf
бесполезный
источник
0

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

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

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

Саймон
источник
0

Я обнаружил, что папки с несколькими слоями каталогов действительно сильно замедляют способность Window быстро их удалять. Я работал над проектом, где потребовалось 5 уровней, чтобы добраться до папки node_modules, которую всегда нужно удалить, даже если

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

В этой ситуации я в конечном итоге перехожу к папке node_modules или любой другой каталог с самыми глубокими уровнями и просто начинаю выбирать и удалять около дюжины каталогов за раз. Если я получу несколько удалений, это заставит корзину работать в параллельных процессах, а не в единственном потоке, который, как я считаю, использует, значительно ускоряет процесс.

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

Это очень ручной процесс, и, вероятно, он может быть выполнен с некоторым успехом, но это то, что работает для меня

TabsNotSpaces
источник
0

Я использовал оригинальный ответ Хьюго для создания файла .bat, который я использую при удалении проектов NPM. Я добавил переменную пути и должен только скопировать и вставить путь один раз. Дважды щелкните файл .bat, и он сделает всю работу - не нужно вводить все.

set path="FOLDER_PATH"
del /f/s/q %path% > nul
rmdir /s/q %path%

Пример использования:

set path="C:\Projects\My React Project"
del /f/s/q %path% > nul
rmdir /s/q %path%
зимородок
источник
-2

Вы пытались использовать командную строку

rmdir /s /q foldername

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

Nejc
источник
5
Это нонсенс. Операция может быть медленной, потому что GUI должен считать все файлы, чтобы оценить требуемое время, но не из-за перерисовки.
Бендер
неправильно ... Я постоянно работаю с большими папками (в основном с сервером win2k) и использую TotalCommander для перемещения / копирования / удаления файлов. Я заметил, что если я минимизирую TC или помещаю другое окно приложения поверх TC, то работа выполняется как минимум на 50% быстрее. TC все еще перерисовывает визуальные вещи, но все игнорируется при компоновке ...
nEJC
6
Ваш компьютер настолько медленный, что операции графического интерфейса влияют на производительность дискового ввода-вывода? Или TotalCommander просто невероятно плохо закодирован? Диск в сотни или тысячи раз медленнее, чем процессор, оперативная память и видеокарта. Если графика замедляет запись на диск, у вас есть серьезные проблемы.
Мистер Сияющий и Новый
1
В вопросе «почему-то не было времени, пропорционального количеству файлов». Я не ищу на 50% быстрее.
Синдри Траустасон
@Sindri Если вы сделаете это способом командной строки, то почти не должно быть никаких задержек, прежде чем система начнет работать со своей магией. Насколько я понимаю, эта предварительная обработка - вот где ваша проблема.
nEJC