Как быстро удалить папку с большим количеством подпапок?

15

У меня есть папка с 266778 подпапками. Как я могу удалить это?

я пытался

cd ~/.local/share/Trash/
sudo rm -rf *

но это занимает много времени. Через 1 минуту 25 секунд реального времени и 0,072 секунды пользовательского времени было удалено только 2500 папок. Таким образом, удаление этой папки займет более двух часов.

Есть ли более быстрый способ удалить эту папку? Почему такая большая разница между временем пользователя и реальным временем?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Я использую Linux 2.6.32 (Ubuntu 10.04.4 LTS).

Мартин Тома
источник
Я только что погуглил эту проблему, и кажется, что некоторые люди обнаружили, что rsync может использоваться как инструмент «удаления многих файлов» довольно эффективно. Действительно ли это быстрее, зависит от вас, чтобы оценить.
Йохан
2
Для чего это стоит: производительность при удалении многих папок / файлов сильно зависит от файловой системы. По моему опыту, разница при удалении миллионов маленьких файлов на ext3 (медленный) и XFS (быстрый) может составлять часы.
pdo
Если у вас часто бывает такой случай, и вы можете планировать заранее, используя файловую систему, такую ​​как btrfs, и используя подобъем, вы можете ускорить процесс, просто сбросив этот подобъем.
PlasmaHH
Здесь вы можете найти ответ. Perl один самый быстрый. unix.stackexchange.com/questions/37329/…
SDsolar

Ответы:

17

Если ваша версия "find" реализует подкоманду -delete, вы можете попробовать

find directory -delete

В таком случае:

find ~/.local/share/Trash/ -delete

Некоторые команды, такие как rm, выполняют большую часть своей работы в ядре. В подпрограммах файловой системы, если быть точным. Время, затрачиваемое на выполнение системных вызовов, учитывается таким образом, поэтому, пока ваша команда «rm» выполняется в течение длительного времени, она не выполняет много работы в пользовательской среде - системные вызовы выполняют большую часть работы.

Johan
источник
+1; хотя это также удаляет родительский каталог, и я подозреваю, что OP хотел удалить только содержимое папки «Корзина», а не саму папку
don_crissti
1
@don_crissti: хорошее замечание. если ОП хотел удалить только подкаталоги в ~ / .local / share / Trash (а не файлы на 1-м уровне), то: find ~/.local/share/Trash/*/ -delete (конечно, это также удалит файлы (и каталоги) в любом из этих Trash / * / subdirs)
Оливье Дюлак
2
+1 за объяснение странного поведенияtime
Мартин Тома
3
Это find directory -deleteдействительно быстрее, чем rm -rf directory? В конце концов, они выполняют ту же самую работу, и нет двух способов сделать это.
Жиль "ТАК - перестань быть злым"
1
@ Йохан найти очень быстро. Вы когда-нибудь получали возможность выяснить причину?
Harshdeep
20

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

{ mv directory directory.gone && rm -rf directory.gone; } &

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

Кодзиро
источник
Отлично. Каков ваш вариант использования для этого все время? Если вы делаете это много, разве нет опасности, что вы будете отставать, получать несколько каталогов 'каталогов и потерпеть неудачу? Я предполагаю, что вы используете суффикс, такой как '$$' или '% (date ...)'
smci
1
Если бы мне это было нужно, я мог бы использовать mktemp с аргументами, которые гарантируют, что он останется в той же файловой системе. Но я не могу сказать, что у меня есть конкретный пример прямо сейчас.
Кодзиро
Кодзиро, да, спасибо, mktempэто то , что я пытался вспомнить ...
smci
1

rm -rf directoryили, rm -rf *конечно, самый быстрый метод, если ваша локальная rmреализация не сломана.

Использование не findдает никаких преимуществ.

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

UFS и ZFS на Solaris , как известно, очень быстро с такой задачей , как обе реализации файловой системы включают задержка фона удаления кода , который заставляет unlink()и rmdir()призывы вернуться быстро , даже если соответствующий объект займет больше времени , в общей сложности.

Благодаря отложенному удалению фона в ядре обновления каталога также могут выполняться быстро, что помогает ускорить всю операцию.

Шили
источник
Хотя можно подумать, что это можно простить, на самом деле это не так, как описывает этот ответ .
Hitechcomputergeek
0

Это только частичный ответ, проливающий свет на три значения, которые возвращает команда; цитируется с time(1)man-страницы :

(я) прошедшее реальное время между вызовом и завершением, (б) времени , пользователь процессора (сумма из tms_utimeи tms_cutimeзначения в struct tmsкачестве возвращаемый times(2)), и (III) , системное время процессора (сумма значений tms_stimeи tms_cstimeзначений в struct tmsкак вернул times(2))

schaiba
источник