Разбор конструкции find -exec и варианты использования

Эти команды — мощные инструменты для поиска, обработки и фильтрации данных в Linux.

1. Что означает {} \; в команде find?

  • {} – это специальный placeholder, который заменяется на имя каждого найденного файла.
  • \;завершает команду, передаваемую в -exec. Обратный слэш (\) экранирует точку с запятой, чтобы shell не интерпретировал её как конец команды.

Пример:

find /home -user olduser -exec chown newuser {} \;

Здесь:

  1. find ищет все файлы в /home, принадлежащие olduser.
  2. Для каждого файла выполняется chown newuser filename.
  3. {} подставляется как имя файла, а \; указывает на конец команды.

2. Альтернативные форматы -exec

Вариант 1: + вместо \; (группировка файлов)
  • + в конце передаёт все найденные файлы одной командой (эффективно для массовых операций).

Пример:

find /var/log -name "*.log" -exec tar -czvf logs.tar.gz {} +
  • Создаёт один архив со всеми .log-файлами (вместо запуска tar для каждого файла отдельно).
Вариант 2: -execdir (безопасное выполнение)
  • Выполняет команду в директории файла (защита от path injection).

Пример:

find /tmp -type f -execdir rm {} \;
  • Удаляет файлы, запуская rm из их родительских директорий.

3. Другие полезные команды с -exec

Изменение прав (chmod)
find /path -type f -exec chmod 644 {} \;
  • Устанавливает права 644 на все файлы.
Поиск и замена текста (sed)
find . -name "*.txt" -exec sed -i 's/foo/bar/g' {} \;
  • Заменяет foo на bar во всех .txt-файлах.
Копирование файлов (cp)
find /src -name "*.jpg" -exec cp {} /dest \;
  • Копирует все .jpg из /src в /dest.
Подсчёт строк (wc)
find . -type f -exec wc -l {} \;
  • Считает строки в каждом файле.
Удаление файлов старше 30 дней
find /backups -mtime +30 -exec rm {} \;
  • Удаляет файлы, не изменявшиеся больше месяца.

4. Комбинации с xargs (альтернатива -exec)

Если -exec неудобен, можно использовать xargs:

find /path -name "*.tmp" | xargs rm
  • xargs передаёт имена файлов в rm пачками (аналогично + в -exec).

С обработкой пробелов в именах:

find /path -name "*.log" -print0 | xargs -0 tar -czvf logs.tar.gz
  • -print0 и -0 корректно обрабатывают пробелы в путях.

5. Полезные опции find для -exec

Опция Пример Описание
-type f find /path -type f -exec ... Только файлы.
-type d find /path -type d -exec ... Только директории.
-mtime -7 find /log -mtime -7 -exec ... Файлы, изменённые за последние 7 дней.
-size +1G find / -size +1G -exec ... Файлы >1 ГБ.
-perm 777 find / -perm 777 -exec ... Файлы с правами 777.

Итог

  • {} \; – подставляет имя файла и завершает команду.
  • + – группирует файлы для одной команды (эффективнее).
  • -execdir – безопасное выполнение в директории файла.
  • Альтернативы: xargs, -delete, -printf.

Пример на все случаи:

find ~/Downloads -name "*.iso" -size +1G -exec ls -lh {} +
  • Находит ISO-файлы >1 ГБ в ~/Downloads и выводит их список с размерами.