При работе сайтов в одном каталоге иногда скапливается очень большое количество файлов — чаще всего это кэш, если файлов в директории на одном уровне слишком много (могут быть это сотни тысяч и миллионы файлов) удалить их стандартными средствами бывает невозможно. В рамках материала будет рассмотрено как удалить большое количество файлов в Linux.
Команда ls, позволяющий в обычных условиях просмотреть содержимое каталога, будут потреблять всю доступную оперативную память (RAM), а rm -rf ./* при удалении — все ресурсы диска, упираясь в лимит по количеству возможных операций ввода-вывода IO (input-output) или в ресурсы процессора.
Удалять файлы можно используя утилиту 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 пользователя, от имени которого производится удаление).