Linux и UNIX: программирование в shell. Руководство разработчика. - страница 13
2.1.13. Опции -exec и -ok
Предположим, вы нашли нужные файлы и хотите выполнить по отношению к ним определенные действия. В этом случае вам понадобится опция -exec (некоторые системы позволяют с помощью опции -exec выполнять только команды ls или
ls -l). Многие пользователи применяют опцию -exec для нахождения старых файлов, подлежащих удалению. Я рекомендую вместо команды rm выполнить сначала команду ls, чтобы убедиться в том, что команда find нашла именно те файлы, которые нужно удалить.
После опции -exec следует указать выполняемую команду, а затем ввести фигурные скобки, пробел, обратную косую черту и, наконец, точку с запятой. Рассмотрим пример:
>$ find . — type f -exec ls -1 {} \;
>-rwxr‑xr‑x | >10 | >root | >wheel | >1222 | >Jan 4 1993 | >./sbin/C80 |
>-rwxr‑xr‑x | >10 | >root | >wheel | >1222 | >Jan 4 1993 | >./sbin/Normal |
>-rwxr‑xr‑x | >10 | >root | >wheel | >1222 | >Jan 4 1993 | >./sbin/Revvid |
Здесь выполняется поиск обычных файлов, список которых отображается на экране с помощью команды ls -l.
Чтобы найти файлы, которые не обновлялись в каталоге /logs в течение последних пяти дней, и удалить их, выполните следующую команду:
>$ find /logs -type f -mtime +5 -exec rm {} \;
Следует соблюдать осторожность при перемещении и удалении файлов. Пользуйтесь опцией -ok, которая позволяет выполнять команды mv и rm в безопасном режиме (перед обработкой очередного файла выдается запрос на подтверждение). В следующем примере команда find находит файлы с расширением LOG, и если какой‑то файл создан более пяти дней назад, она удаляет его, но сначала просит вас подтвердить эту операцию:
>$ find . — name "*.LOG" — mtime +5 -ok rm {} \;
>< rm… ./nets. LOG > ? у
Для удаления файла введите у, а для предотвращения этого действия — n.
2.1.14. Дополнительные примеры использования команды find
Рассмотрим еще несколько примеров, иллюстрирующих применение команды find . Ниже показано, как найти все файлы в своем начальном каталоге:
>$ find ~ -print
Найти все файлы, для которых установлен бит SUID, позволяет следующая команда:
>$ find . — type f -perm +4000 -print
Чтобы получить список пустых файлов, воспользуйтесь такой командой:
>$ find / -type f -size 0 -exec ls -l {} \;
В одной из моих систем каждый день создается системный журнал аудита. К имени журнального файла добавляется номер, что позволяет сразу определить, какой файл создан позже, а какой -pаньше. Например, версии файла admin.log нумеруются последовательно: admin.log.001, admin.log. O02 и т. д. Ниже приведена команда find, которая удаляет все файлы admin.log, созданные более семи дней назад:
>$ find /logs -name 'admin.log. [0-9] [0-9][О-9] ' — atime +7 exec \ rm {} \;
2.2. Команде xargs
При наличии опции -exec команда find передает указанной команде все найденные файлы, которые обрабатываются за один раз. К сожалению, в некоторых системах длина командной строки ограниченна, поэтому при обработке большого числа файлов может быть выдано сообщение об ошибке, которое обычно гласит: "Too many arguments" (слишком много аргументов) или "Arguments too long" (слишком большой список аргументов). В этой ситуации на помощь приходит команда xargs. файлы, полученные от команды find, она обрабатывает порциями, а не все сразу.
Рассмотрим пример, в котором команда find возвращает список всех файлов, имеющихся в системе, а команда xargs выполняет для них команду file, проверяющую тип каждого файла:
>$ find / -type f -print | xargs file
>/etc/protocols: English text /etc/securetty: ASCII text
Ниже приведен пример, демонстрирующий поиск файлов дампа, имена которых команда echo помешает в файл /tmp/core.log.
>$ find / -name core -print | xargs echo > /tmp/core.log
В следующем примере в каталоге /apps/audit выполняется поиск всех файлов, к которым другие пользователи имеют полный доступ. Команда chmod удаляет для них разрешение на запись:
>$ find /apps/audit -perm -7 -print | xargs chmod o‑w
Завершает наш перечень пример, в котором команда grep ищет файлы, содержащие слово "device":
>$ find / -type f -print | xargs grep "device"
2.3. Заключение
Команда find представляет собой прекрасный инструмент поиска различных файлов по самым разнообразным критериям. Благодаря опции -exec, а также команде xargs найденные файлы могут быть обработаны практически любой системной командой.