Назад | Перейти на главную страницу

Невозможно удалить сразу много файлов в 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

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

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

find . -type -f -delete

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

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

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

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

rm -rf log*

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

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

Пытаться

find . -type f | xargs rm -vf

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

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

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

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

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

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

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