Есть ли более быстрый способ удаления каталога, чем & ldquo; rm -rf & rdquo ;?

У меня есть папка с множеством файлов, и «rm -rf» занимает много времени. Есть ли более быстрый способ удалить каталог и его содержимое (подкаталоги и т. Д.)?

31
задан 22 March 2012 в 05:31

5 ответов

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

rm так же хорош, как он получает.


Некоторые люди упоминают крайние случаи, когда некоторые вещи быстрее, чем другие. Но давайте убедимся, что мы сравниваем лучшие версии одних и тех же вещей.

Если вы хотите удалить каталог и все в нем, я предлагаю вам:

rm -rf path/to/directory

rm будет внутренне перечислять файлы и каталоги, которые он собирается удалить , И это все в скомпилированном C . Это две причины, по которым он самый быстрый.

Это очень не то же самое, что rm -rf path/to/directory/*, который расширит на уровне оболочки и передаст множество аргументов в rm. Затем rm должен проанализировать их, а затем выполнить рекурсию от каждого. Это намного медленнее.

Точно так же, как «эталон», который сравнивает find path/to/directory -exec {} \;, - нонсенс Он запускает rm один раз для каждого найденного файла. Так медленно. Find может использовать аргументы команд сборки в стиле xargs с -exec rm {} +, но это так же медленно, как и расширение. Вы можете вызвать -delete, который использует внутренний вызов unlink для ядра (как это делает rm), но сначала он будет работать только для файлов.

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


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

Или используйте более быстрый диск. Если у вас много оперативной памяти, использование /dev/shm (RAM-диска) может быть идеей.

0
ответ дан 22 March 2012 в 05:31

Иногда find $DIR_TO_DELETE -type f -delete быстрее, чем rm -rf.

Вы также можете попробовать mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

Наконец, если вам нужно удалить содержимое целого раздела, наиболее быстрыми будут, вероятно, umount, mkfs и повторно mount.

0
ответ дан 22 March 2012 в 05:31

Если Вам не нужно свободное пространство, самым быстрым путем является задержка удаление, и сделайте это в фоновом режиме:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

Затем имейте crontab, который делает это в фоновом режиме, в спокойное время, с низким вводом-выводом proiority:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Примечания:

  • проверьте свой вывод прежде, чем удалить эхо в crontab!
  • .delete_me каталог должен быть в той же файловой системе - в случае, если это не очевидно для всех.

Обновление: Я нашел, что аккуратный прием выполнил несколько комната параллельно - это поможет, если у Вас будет большой дисковый массив:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • - глубина, чтобы сделать обход в глубину.

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

  • - d \n для обработки пробелов в именах файлов.

  • - P и-n обрабатывает степень параллелизма (проверьте страницу справочника).

касательно: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Обновите 2 (2018): С ZFS, поставленным с Ubuntu 18.04, я использую его для всего, и я создам новый набор данных для любого большого проекта. Если Вы планируете заранее и делаете это заранее, Вы можете просто "zfs, уничтожают" файловую систему, когда Вы сделаны.;-)

Я использовал инструкции от zfsonlinux Wiki для установки Ubuntu на ZFS исходно: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS

8
ответ дан 22 March 2012 в 05:31

Хотя это и бесполезно, если вы хотите очистить существующий каталог, я упомяну, что возможной стратегией, если вы знаете, что у вас будет каталог с большим количеством файлов, которые вам нужно будет регулярно чистить, является помещение каталога в его собственная файловая система (, например, , раздел). Затем, когда вам нужно очистить его, размонтируйте его, запустите mkfs и установите его заново. Например, OpenBSD рекомендует сделать это для /usr/obj , где много файлов создаются во время сборки системы и должны быть удалены до следующей сборки.

0
ответ дан 22 March 2012 в 05:31

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

Например, у меня работает зонмидер, бегущий за площадкой для гольфа. Я разработал Linux-рейд объемом 1,5 ТБ для обработки огромного количества данных, которые она записывает за день (12 камер), и то, как она работала на диске 120 ГБ, выше моего понимания. Короче говоря, папка со всеми захваченными данными составляет около 1,4 ТБ ее хранилища. Много чисток

Переустанавливать ZM и очищать старую библиотеку объемом 1,4 ТБ - неинтересно, так как удаление старых изображений может занять 1-2 дня.

Истинно индексированная ФС позволяет удалить каталог и знает, что данные в нем мертвы, а обнуление данных - пустая трата нашего времени и ресурсов ПК. Это должна быть опция обнуления удаленных данных. RM просто долго в реальном мире на ext4.

Ответ: Рекурсивное удаление всех файлов будет быстрее, но вам все равно придется выделить время для запуска FSCK.

Создайте сценарий, выполняющий рекурсивную команду «FOR», которая может «отсоединить» все файлы в ваших папках, а затем просто нажмите rm или rmdir для всех папок, чтобы очистить его. Вручную запустите FSCK, чтобы обнулить остальные данные, когда это будет удобно. Вроде ленивый не выписал это извините :).

0
ответ дан 22 March 2012 в 05:31

Другие вопросы по тегам:

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