Удаление большого количества файлов в Linux

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

 

Команда ls, позволяющий в обычных условиях просмотреть содержимое каталога, будут потреблять всю доступную оперативную память (RAM), а rm -rf ./* при удалении — все ресурсы диска, упираясь в лимит по количеству возможных операций ввода-вывода IO (input-output) или в ресурсы процессора.

 

Как удалить большое количество файлов в Linux

 

Удалять файлы можно используя утилиту find, в отличие от ls или rm с указанием маски она не формирует изначально список содержимого каталога, а перебирает файлы по одному.

 

Посчитать количество файлов можно так

find /home/web/example.com/www/opt/cache/ -type f ¦ wc -l

 

С -exec rm -f можно запустить процесс удаления файлов (он может занять длительное время)

 

find /home/web/example.com/www/opt/cache/ -type f -exec rm -f {} \;

 

Можно попробовать find с опцией delete

 

find /home/web/example.com/www/opt/cache/ -type f -delete

 

 

Скорее всего не даст никакого результата rm с указанием файлов по маске — система при этом до того как начать удаление попытается сформировать полный список файлов, что сделать не получится

rm /home/web/example.com/www/opt/cache/*

 

 

 

Также существует вариант с ls -f, вывод которого перенаправляется в xargs по 100 файлов, затем удаляемых при помощи rm. Может успешно отрабатывать, однако если файлов слишком много вывести список не получится и с ls -f

cd /home/web/example.com/www/opt/cache/ ; ls -f . | xargs -n 100 rm

 

Самой эффективной командой обычно оказывается find с -exec rm -f, однако все зависит от количества файлов и использовать стоит все представленные варианты (приоритет процессов при удалении имеет смысл максимально понижать используя nice и ionice — алиасы для find или других команд можно добавить в .bashrc пользователя, от имени которого производится удаление).