Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Примеры использования программы find с параметром exec

Оригинал: Linux shell, how to use the exec option in find with examples
Автор: Riccardo Capecchi
Дата публикации: 23 сентября 2012 г.
Перевод: А.Панин
Дата публикации перевода: 19 ноября 2012 г.

В прошлой статье я писал о программе locate, удобной для быстрого поиска файлов в системе.

Альтернативой locate является программа find: GNU find обходит каждый файл из дерева директорий, подставляя его имя в заданное выражение и проводит вычисление значения выражения слева до получения результата (правая часть выражения ложна для операции логического "и", истинна для логического "или"), на основании которого find принимает решение о выполнении заданного действия и переходит к рассмотрению следующего имени файла.

Программа find может принимать различные аргументы командной строки для создания выражения поиска, а стандартным действием при обнаружении файла с именем, удовлетворяющим выражению, является печать имени файла.

Перед тем, как как привести полезные примеры использования программы find с параметром exec, рассмотрим немного теоретических положений.

Параметры программы find

Наиболее известными параметрами для поиска файлов при помощи программы find, являются:

-name выражение Это наиболее часто используемый параметр для поиска файлов, имена которых (без учета предшествующих им директорий) удовлетворяют заданному выражению.

-mtime n Файлы были изменены n*24 часов назад.

-size n[cwbkMG] Файл занимает n единиц пространства на диске. Допустимо использование следующих суффиксов:
  • 'b' для блоков по 512 байт (используется по умолчанию если суффикс не задан)
  • 'c' для байт
  • 'w' для двухбайтовых слов
  • 'k' для Килобайт (единицы размером в 1024 байта)
  • 'M' для Мегабайт (единицы размером в 1048576 байт)
  • 'G' для Гигабайт (единицы размером в 1073741824 байт)

-uid n Системный числовой идентификатор пользователя-владельца файла должен быть равен n.

Действия

При использовании find есть возможность для указания действий, которые будут выполнены при нахождении файла с именем, удовлетворяющим выражению поиска, а наиболее гибким вариантом, без сомнения, является использование параметра exec.

-exec команда; Выполнить команду; выполнение считается успешным в случае статуса выхода, равного нулю. Все символы, следующие за командой, считаются ее аргументами до того момента, как встречается символ ";". Строка "{}" заменяется на имя рассматриваемого файла каждый раз, когда она встречается среди аргументов команды.

Примеры использования find с параметром exec

Поиск файлов и удаление их при помощи параметра exec является часто встречающимся вариантом использования этого параметра, но вам не нужно использовать exec для этих целей, так как более удачный вариант будет описан позднее.

Поиск всех файлов с расширением .old и их удаление:
find / -name "*.old" -exec /bin/rm {} \;
Поиск всех файлов, размер которых превышает 100 МБ и их удаление:
find / -size +100M -exec /bin/rm {} \;
Бывают и такие случаи, что программы "сходят с ума" и заполняют директории тысячами мелких файлов, при этом вы не сможете просто использовать команду rm * по той причине, что командная оболочка не в состоянии заменить символ * на имена всех этих файлов, зато в состоянии удалить эти файлы по очереди:
find . -exec /bin/rm {} \;
Помните, что вы не должны использовать эти примеры, поскольку для удаления файлов у GNU find есть параметр -delete, более безопасный, нежели "-exec /bin/rm {};". Пример использования:
find / -name "*.old" -delete

В старых системах Unix у вас не будет возможности использовать параметр -delete, поэтому альтернатив параметру -exec для удаления файлов в них не остается.

А теперь рассмотрим некоторые другие примеры использования программы find с параметром exec.

Рекурсивное изменение прав доступа для файлов, не затрагивающее директории.
find ./ -type f -exec chmod 644 {} \;

При помощи параметра -type f вы можете вести поиск только файлов и просто изменять права доступа к каждому из них при помощи chmod.

Рекурсивное изменение владельца файлов с olduser на newuser
find / -user olduser  -type f  -exec chown newuser {} \;

В этом примере я использовал параметр -user как альтернативу параметру -uid.

Рекурсивное изменение прав доступа для всех директорий
find . -type d -exec chmod 755 {} \;

В этом примере я снова использовал параметр -type, но на этот раз с аргументом d для поиска директорий.

Заключение

Как вы убедились, в приведенных выше примерах показано то, что использование программы find с параметром exec позволяет вам выполнять довольно сложные задачи, при этом то обстоятельство, что вы можете выполнять заданное действие только над частью файлов, ставит вас в выигрышное положение.