Чи є швидший спосіб видалити каталог, ніж "rm -rf"?


32

У мене папка, яка має багато файлів, і "rm -rf" потребує багато часу для завершення. Чи є швидший спосіб видалити каталог і його вміст (підкаталоги тощо)?


Для всіх, хто цікавиться, дивіться: slashroot.in/comment/1286#comment-1286 знайти козирі перли козирі rsync
Rinzwind

Відповіді:


33

Ви можете спробувати скасовуючи зв'язку індексного дескриптора для каталогу , але що б залишити вас весь вантаж безгоспних файлів , які fsck будуть відкидається о.

rm так добре, як це отримує.


Кілька людей згадують крайові випадки, коли деякі речі швидше інших. Але давайте переконаємось, що ми порівнюємо найкращі версії одних і тих же речей.

Якщо ви хочете видалити каталог і все, що в ньому, я пропоную вам:

rm -rf path/to/directory

rmбуде внутрішньо список файлів і каталогів , це буде видалити. І це все в скомпільований C . Саме ці дві причини найшвидші.

Це дуже точно не те саме, rm -rf path/to/directory/*що розшириться на рівні оболонки і передасть набір аргументів rm. Потім rmмає проаналізувати ці, а потім повторити з кожного. Це набагато повільніше.

Так само як "орієнтир", який порівнює, find path/to/directory -exec {} \;- це нісенітниця. Це запускається rmодин раз на знайдений файл. Так повільно. Знайти аргументи команд для побудови команд xargs, -exec rm {} +але це так само повільно, як і розширення. Ви можете зателефонувати, -deleteякий використовує внутрішній unlinkдзвінок до ядра (як rmце робиться), але це буде працювати лише для файлів спочатку.

Так що повторити, якщо ви не кинете диск в рідку гарячу магму, rmце цар .


У відповідній примітці різні файлові системи видаляють речі з різною швидкістю через їх структурування. Якщо ви робите це регулярно, можливо, ви захочете зберігати ці файли у розділі, відформатованому в XFS, який, як правило, обробляє видалення досить швидко.

Або скористайтеся більш швидким диском. Якщо у вас є тонна оперативної пам’яті, використання /dev/shm(диск RAM) може бути ідеєю.


Насправді не можна використовувати unlinkсистемний виклик у каталогах (ви отримаєте EISDIRпомилку), тому перший варіант неможливий.
Джеймс Генстридж

Чи швидше би передача телевізора на / tmp? Здається, що й телебачення займає багато часу.
Мохаммед Могімі

@MohammadMoghimi: mving між різними файловими системами / розділами означає, що cpслідує a rm.
enzotib

3
@enzotib Однак, якщо /tmpв одній файловій системі, мені цікаво, чи mvперезапуск буде швидшим? Я не впевнений, чи /tmpвсе-таки очищено за допомогою rm.
Sparhawk

1
rsyncу цьому еталоні справа швидше, ніж rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos

11

Іноді, find $DIR_TO_DELETE -type f -deleteшвидше, ніж rm -rf.

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

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


1
не type -fпозначає файл, а не каталог? також додавання -printпоказує файли під час їх видалення.
leetbacoon

8

Якщо вам не потрібен вільний простір, найшвидший спосіб - це затримати видалення та зробити це у фоновому режимі:

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

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

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

Примітки:

  • перевірте свій вихід перед тим, як зняти відлуння у crontab!
  • каталог .delete_me повинен знаходитися в одній файловій системі - якщо це не очевидно для всіх.

Оновлення. Я знайшов акуратний трюк для паралельного запуску декількох RM - це допоможе, якщо у вас великий масив дисків:

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 вікі для встановлення Ubuntu до ZFS на самому собі: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


2
Замість цієї останньої команди використовуйте find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Цей -depthпараметр повідомляє, findщоб спочатку перелічити дітей.
муру

2

Я думаю, що проблема полягає в тому, що немає ідеального способу видалити дуже великий каталог і весь його набір вмісту з справжньою індексованою системою подачі заявок, яка розуміє відключення і не означає, що вона думає, що у неї відсутні файли ala FSCK. Має бути довіра.

Наприклад, у мене є zoneminder, який працює для гольфу. Я сконструював набіг linux в 1,5 ТБ, щоб обробляти величезну кількість даних, які вона щодня фіксує (12 каналів камери), як вона працює на 120 ГБ накопичувачі. Коротка папка для всіх захоплених даних становить близько 1,4 ТБ її зберігання. Багато очищати

Потрібно перевстановити ZM та очистити стару бібліотеку 1,4 ТБ - це не цікаво, оскільки для видалення старих зображень може знадобитися 1 - 2 дні.

Справжній індексований FS дозволяє випадати каталог і знає, що дані під ним мертві, а нульове видалення даних є марною витратою нашого часу та ресурсів ПК. Це має бути можливість нульового виключення видалених даних. RM просто займає довгий час у реальному світі на ext4.

Відповідь: Рекурсивне від’єднання всіх файлів буде швидше незначним, але вам все одно доведеться відкласти час для запуску FSCK.

Створіть скрипт, який виконує рекурсивну команду "ЗА", яка може "від'єднати" всі файли у ваших папках, а потім просто rm або rmdir всі папки, щоб очистити його. Запустіть FSCK вручну, щоб нульово залишити інші дані, коли це зручно. Ніби лінивий не виписав це вибачте :).


0

Хоча не корисно, якщо ви хочете очистити існуючий каталог, я згадаю, що можлива стратегія, якщо ви знаєте, що у вас буде каталог з низкою файлів, які вам потрібно буде регулярно очищати, - це помістити каталог у власну файлову систему ( наприклад , перегородка). Потім, коли вам потрібно буде його очистити, відключити його, запустити mkfsта повторно встановити його. Наприклад, OpenBSD радить зробити це для/usr/obj , коли багато файлів створюються під час збирання системи, і їх слід видалити до наступної збірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.