Когда нужно выполнить команду для большого количества файлов, чаще всего используют два подхода:
find ... -exec или find ... | xargs. Они решают одну задачу, но ведут себя по-разному.▪️ find -exec - простой и безопасный. Пример: удалить .log файлы старше 7 дней
find /var/log -type f -name "*.log" -mtime +7 -exec rm {} \;
{} - подставляет найденный файл.\; - завершает команду.Плюсы: безопасно работает с пробелами, не ломается на спецсимволах и не требует пайпа
Но есть нюанс: команда запускается для каждого файла.
▪️ Ускоренный вариант -exec. Можно запускать команду пакетами:
find /var/log -type f -name "*.log" -exec rm {} +
Теперь rm получит много файлов за раз. По скорости это почти как xargs.
▪️ xargs - быстрее для больших списков. Пример:
find /var/log -type f -name "*.log" | xargs rm
xargs собирает много аргументов и запускает команду одним вызовом. Можно ограничить размер батча:
find . -name "*.tmp" | xargs -n 10 rm
⚠️ Главная проблема xargs. Файлы с пробелами ломают команду:
file one.txt
file two.txt
Поэтому правильный вариант:
find . -type f -print0 | xargs -0 rm
Пара:
-print0
xargs -0
делает обработку 100% безопасной.
BashTex 📱 #bash #utils