Разбор конструкции find -exec и варианты использования
Эти команды — мощные инструменты для поиска, обработки и фильтрации данных в Linux.
1. Что означает {} \;
в команде find
?
{}
– это специальный placeholder, который заменяется на имя каждого найденного файла.\;
– завершает команду, передаваемую в-exec
. Обратный слэш (\
) экранирует точку с запятой, чтобы shell не интерпретировал её как конец команды.
Пример:
find /home -user olduser -exec chown newuser {} \;
Здесь:
find
ищет все файлы в/home
, принадлежащиеolduser
.- Для каждого файла выполняется
chown newuser filename
. {}
подставляется как имя файла, а\;
указывает на конец команды.
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
и выводит их список с размерами.