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

Если вы используете установщик рабочего стола (он же Ubiquity), вы можете попробовать поставить ваш late_command под

ubiquity ubiquity/success_command string

, как

ubiquity ubiquity/success_command string /bin/echo "trying echo" > /var/log/myfile

Обычно я помещаю как это, так и di stanza, просто чтобы убедиться, что файл preseed работает на обоих.

23
задан 22 March 2012 в 07:31

5 ответов

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

rm так же хорош, как и он.

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

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

rm -rf path/to/directory
[d6 ] rm будет внутренне перечислять файлы и каталоги, которые он собирается удалить. И это все в компиляции C. Это две причины, по которым это происходит быстрее.

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

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

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

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

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

24
ответ дан 25 May 2018 в 13:19
  • 1
    Фактически вы не можете использовать системный вызов unlink в каталогах (вы получите ошибку EISDIR), так что первый вариант невозможен. – James Henstridge 22 March 2012 в 09:01
  • 2
    Будет ли mv to / tmp быстрее? Кажется, что mv тоже занимает много времени. – Mohammad Moghimi 22 March 2012 в 10:35
  • 3
    @MohammadMoghimi: mv между различными файловыми системами / разделами означает cp, за которым следует rm. – enzotib 22 March 2012 в 12:52
  • 4
    @enzotib Однако, если /tmp находится в одной файловой системе, мне интересно, будет ли mv и перезагрузка быстрее? Я не уверен, что /tmp очищается с помощью rm в любом случае. – Sparhawk 15 November 2013 в 06:23

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

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

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

7
ответ дан 25 May 2018 в 13:19

Если вам не нужно свободное пространство, самый быстрый способ - это отложить удаление и сделать это в фоновом режиме:

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

Тогда у вас есть crontab, который делает это в фоновом режиме в спокойное время с низким приоритетом ввода / вывода:

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

Примечания:

mkdir .delete_me . Каталог .delete_me должен находиться в одной файловой системе - в случае, если это не очевидно для всех.

Обновление: я нашел опрятный трюк для запуска нескольких rm параллельно - это поможет, если у вас большой массив дисков:

find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
. Каталог .delete_me имеет быть в одной файловой системе - в случае, если это не очевидно для всех. mv big-directory-that-i-want-gone .delete_me -d \ n для обработки пробелов в именах файлов. -P и -n обрабатывает степень параллелизма (check manpage).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

4
ответ дан 25 May 2018 в 13:19
  • 1
    Вместо этой последней команды используйте find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Опция -depth сообщает find сначала перечислить детей. – muru 10 March 2016 в 03:09

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

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

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

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

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

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

1
ответ дан 25 May 2018 в 13:19

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

0
ответ дан 25 May 2018 в 13:19

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

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