Вопрос: Не удалось удалить много файлов одновременно в Linux


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

найти . -type f -exec rm -v {} \;

rwxrwxr-x  2 root     root      77881344 Mar 16 03:06 logs.123  
drwxrwxr-x  2 root     root     105709568 Nov 14 20:09 logs_15Nov2011  
drwxrwxr-x  2 root     root       6852608 Aug  1  2011 logs2  
drwxrwxr-x  2 root     root     286191616 Nov  2 08:40 logs_2Nov  
drwxrwxr-x  2 root     root      25206784 Nov 10 04:04 logs_del  
drwxrwxr-x  4 root     root       2686976 Oct  6 01:56 logs_delete  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsMay112011  
drwxrwxr-x  2 root     root      69087232 Aug 29  2011 logs_old  
drwxrwxr-x  7 root     root     382480384 May  9  2011 logs.old905  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsTR1218

Любое предложение лучше и быстрее, чем это, чтобы удалить все эти журналы?


5
2018-03-16 10:11


Источник


Каков тип вашей файловой системы? Если ext2 / 3/4, вы используете индексацию каталогов (wiki.archlinux.org/index.php/Ext3#Using_Directory_Indexing)? - jfg956
Это не связано напрямую с вашим вопросом, но после того, как вам удастся удалить эти старые журналы, загляните в logrotate чтобы избежать этой проблемы в будущем: linuxcommand.org/man_pages/logrotate8.html - Ben Lee


Ответы:


У GNU find есть опция -delete, которая всегда безопасна:

find . -type -f -delete

Как прокомментировано в другом месте, вы также можете использовать xargs, но будьте очень осторожны, как вы его используете.

find . -type f -print0 | xargs -0 rm -vf

6
2018-03-16 11:59



Для меня с конечного результата обе команды выглядят одинаково. Не могли бы вы объяснить, почему с помощью второй команды нужно быть более осторожным, спасибо. - Vivek Sharma
Поскольку без NUL-завершенных имен файлов (строк) могут произойти неожиданные результаты - что-то, чего вы не хотите с помощью rm! Подумайте, что произойдет, когда вы запустите «rm -rf / etc foo», то есть удалите каталог с именем «etc foo», который является совершенно допустимым именем файла. Без правильного цитирования вы собираетесь разрушить вашу систему. - adaptr


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

Так вы считали, что просто

rm -rf log*

2
2018-03-16 12:21



Если find -exec не может поместить все аргументы в одну командную строку, то будет и любая другая команда - включая rm. - adaptr
adaptr, я согласен - вот почему я предлагаю сделать рекурсивный rm из родительского каталога, где не так много файлов, а расширение glob не сломает оболочку. - MadHatter
MadHatter - я не хочу хранить каталоги, но команда просто ответит. И порой из-за проблем с Интернетом, замазки закрываются, и команда выходит. - Vivek Sharma
Он не отвечает, потому что у него есть огромная работа, и это крайне неэффективная работа благодаря размеру этих каталогов. Тем не менее, он прогрессирует; вы должны, вероятно, прочитать справочную страницу на экране и запустить rm внутри сеанса экрана, это позволит командам продолжать работать, даже если ваш сеанс ssh отключается, и вы можете просто подключиться к нему, как только вы создадите новую сессию ssh. Или просто выполните задание: rm -rf log* & , - MadHatter
rm -rf log * &, да, это то, что мы делаем сейчас. Тем не менее, спасибо большое. - Vivek Sharma


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

for dir in $(find . -type d)
do
  rm $dir/*
done

1
2018-03-16 10:32



rm -r также удалит пустой каталогов в данном дереве. - adaptr


Пытаться

find . -type f | xargs rm -vf

0
2018-03-16 10:34



xargs - опасно при использовании в сочетании с любой командой, которая изменяет данные. Если вы должны использовать xargs, используйте его с безопасными строками, заключенными в NUL: find . -type f -print0 | xargs -0 rm -vf - adaptr


Помимо переформатирования раздела, я не вижу более быстрого способа удаления всех файлов.

Проблема в том, что в этих каталогах имеется огромное количество файлов (размер в ls -l выход, который вы предоставляете, огромен!). Для каждого rm, файловая система должна выполнить следующие действия:

  1. Запросит каталог для инода номер,
  2. Обновите каталог, чтобы удалить из него файл,
  3. Уменьшает количество ссылок на индексный индекс (см. жесткая ссылка если вы хотите узнать больше о количестве ссылок),
  4. Если счетчик ссылок равен нулю, удалите данные с диска.

Даже если ты rm в каталоге вы избавитесь от шага № 2, потому что вам все равно нужно запросить каталог и уменьшить количество ссылок. Запрос каталога может быть оптимизирован для получения более одного номера inode в то время, но во всех случаях для каждого файла, который нужно удалить, файловая система должна проверить индекс inode для подсчета ссылок и обновить индекс (или отметить его для удаления).

Другими словами, эта операция O(n) на количество удаляемых файлов, причем швы очень большие в вашем случае.

Если вы не можете отформатировать свой раздел, который, я думаю, ваш случай ;-), просто запустите задачу в фоновом режиме или в экран и быть терпеливым.

Другим решением является резервное копирование файлов, которые вы хотите сохранить, форматирование раздела и восстановление файлов. Возможно, это может быть быстрее, чем удаление всех файлов, но это более трудоемко ( find...rm можно забыть в фоновом режиме в течение многих дней, если это необходимо ...).


0
2018-03-17 15:09