find - это утилита для поиска файлов и директорий, а с опцией -exec она превращается в инструмент для выполнения сложных операций над найденными объектами. Вместо множества вызовов команд можно всё сделать в одной строке. Разберём интересные примеры.
Базовый пример. Удалим все файлы .tmp в директории и её подкаталогах:
find /path/to/dir -name "*.tmp" -exec rm {} \;
{} - это подстановка имени файла.
\; - завершает команду -exec.
1. Замена текста в файлах. Найдём файлы .txt и заменим в них все вхождения слова "TODO" на "DONE":
find /path/to/dir -name "*.txt" -exec sed -i 's/TODO/DONE/g' {} \;
Теперь все файлы обновлены автоматически!
2. Сжатие найденных файлов. Архивируем все .log файлы старше 7 дней:
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
3. Сложные операции с несколькими командами. Передача результата одной команды в другую возможна через sh -c:
find /path/to/dir -name "*.conf" -exec sh -c 'mv "$1" "${1%.conf}.bak"' _ {} \;
Здесь мы меняем расширение всех файлов .conf на .bak.
4. Параллельное выполнение с +. Если обработка большого числа файлов занимает много времени, используйте + вместо \; для выполнения команд за один вызов:
find /path/to/dir -name "*.log" -exec rm {} +
Это значительно ускоряет выполнение, передавая несколько файлов в один вызов rm.
5. Просмотр перед выполнением. Всегда проверяйте результат поиска перед выполнением команд:
find /path/to/dir -name "*.log" -exec echo "Удаляю: {}" \;
Это один из способов убедиться, что вы не удалите ничего лишнего.
Комбинация с другими инструментами
1. Аудит прав доступа. Проверим файлы с неправильными правами доступа и исправим их:
find /path/to/dir -type f ! -perm 644 -exec chmod 644 {} \;
Теперь все файлы имеют права 644.
2. Поиск и отправка больших файлов. Найдём файлы больше 100 МБ и передадим список на удалённый сервер:
find /path/to/dir -size +100M -exec scp {} user@remote:/backup/ \;
3. Запрос на подтверждение действий. Используйте -ok вместо -exec для подтверждения действий:
find /path/to/dir -name "*.tmp" -ok rm {} \;
В данном случае каждое действие потребует подтверждения.
BashTex 📱 #linux #utils