У мене є каталог, який містить ~ 3 мільйони файлів у певних підкаталогах на сервері Windows 2008. Видалення файлів вручну через SHIFT + DEL у кореневому режимі займає багато років. Чи є інший спосіб зробити швидше видалення ?
У мене є каталог, який містить ~ 3 мільйони файлів у певних підкаталогах на сервері Windows 2008. Видалення файлів вручну через SHIFT + DEL у кореневому режимі займає багато років. Чи є інший спосіб зробити швидше видалення ?
Відповіді:
ПОПЕРЕДЖЕННЯ: якщо у вас є посилання на каталоги, 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 має перший пропуск для видалення файлів і виведення на нуль, щоб уникнути накладних витрат на екран для кожного окремого файлу. Потім другий прохід очищає решту структури каталогів:
del /f/s/q foldername > nul
rmdir /s/q foldername
Ось результати іншого тесту з використанням 404 МБ з 19 521 файлів у 3 243 папках:
Так що в ньому не так багато, напевно, занадто близько, щоб судити про один тест.
Редагувати: я перевірив значно більше даних, це типовий для мене випадок: 28,3 ГБ із 1159 211 файлів у 146 918 папках:
Нічого собі, метод 2 майже втричі швидший, ніж метод 1! Я буду оновлювати свою deletestuff.bat!
del
ви видалите фактичні каталоги, а не символьні посилання. Будьте дуже обережні з цим і не запускайте ці команди, якщо ви не знаєте, що в каталозі цілі немає посилань.
Якщо вам доведеться регулярно видаляти великі дерева каталогів, подумайте про збереження кореня дерева цього каталогу на окремому розділі, а потім просто швидко відформатувати його, коли потрібно видалити все. Якщо вам потрібно автоматизувати це, ви можете використовувати цю команду 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/
Я зробив bat-файл, який робить те саме.
@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 хвилини (sata 7200rpm). ТАК!
%1
в сценарії, але "%~1"
. Таким чином, якщо аргумент передано з цитатами, він розписується та реквізується. Якщо вона не була передана цитатами, вона цитується.
Використання наведеного нижче коду для мене працює добре.
mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
rsync
в Linux. Це навіть швидше тут rmdir
?
del /f/q/s
+ rmdir /s/q
. Якщо у вашого dir_to_wipe з'явилися викиди, c:\some_important_dir
ви втратите свої дані.
Використовуйте команду rd / s з командного рядка.
Найкраще практичне рішення - це, мабуть, переміщення папки кудись (наприклад, Кошик), а потім почати її видалення. Це пройде віками, але принаймні воно не вийде.
Я впевнений, що час, необхідний для видалення всіх цих файлів, є невід'ємною вимогою завдання, а не неефективністю в реалізації видалення.
Встановіть Cygwin і використовуйте rm -r . Але це, ймовірно, буде зайвим.
rd /q /s
...
rm
справді cygwin такий швидкий, як вбудований cmd.exe rd
? Оскільки емуляція інтерфейсу posix-інтерфейсу досить повільна, тому що вимагає додаткової роботи, що rm
насправді не оцінює.
rm -rf
. Близько 10 хвилин я перервав або повернувся, del /f/s/q
тому що за Cygwin використання диска становило лише 50%. Під del
, використання диска прив’язано до 100%. Тому я вважаю, що його потрібно швидше видаляти. Використання процесора становить <1% для обох методів. Я не впевнений у номері файлу, тому що закрив програму видалення файлів Windows після того, як витратив на обчислення 10 хвилин.
Ви спробували будь-яке з цих двох додатків?
Обов'язково встановіть кількість перезаписів на 0, якщо ви хочете, щоб швидше було виконано. Зробіть це, натиснувши параметри, а потім змініть значення в нижній частині діалогового вікна.
Введіть шлях до видалення у поле Джерело та натисніть Видалити.
Ці програми не ставлять файли у кошик. Використовуйте обережно.
Це передбачено для компліменту та розширення кроків, зроблених у раніше згаданих відповідях.
Наведені вище два способи здаються досить ефективними, але визначити ефективність буде складно, якщо вони не будуть відповідати точно таким же умовам:
Потім виконайте конфігурації за допомогою пакетного файлу та використовуйте Powershell Cmdlet для реєстрації та вимірювання їх продуктивності.
Нижче наведено кілька зразків папок (названих як загальний розмір), над якими я експериментував, але не зміг отримати будь-які переконливі показники / результати.
р.бат
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 , будьте дуже обережні з поглинанням та icacls, викликайте жорсткі посилання, які мають однакові дозволи та власники, тому якщо в папці, яку ви хочете видалити, є ненасичені тверді посилання, використовуючи takeown та icacls, ви зміните дозволи та власники файлів поза папку.
Використовуючи інструмент ln.exe, ви можете перелічити всі файли з твердою посиланням всередині папки та знати, чи є вони жорсткими посиланнями на файли поза папкою (ненасичені тверді посилання):
ln.exe --enum foldername > HardlinksList.txt
Видалення папки швидше, ніж видалення декількох файлів.
Тож якщо ви віддаєте перевагу використовувати миш замість командного рядка, ви можете створити каталог, перемістити файли туди і видалити його (як ви вже сказали Shift + Del).