Для каждого найденного файла, соответствующего заданному шаблону поиска, выполняет команду COMMAND. Командная строка должна завершаться последовательностью символов \; (здесь символ «;» экранирован обратным слэшем, чтобы информировать командную оболочку о том, что символ «;» должен быть передан команде find как обычный символ). Если COMMAND содержит <> , то find подставляет полное имя найденного файла вместо «<>» .
Не следует путать опцию -exec команды find с внутренней командой Bash — exec.
Пример 12-2. Badname, удаление файлов в текущем каталоге, имена которых содержат недопустимые символы и пробелы.
Пример 12-3. Удаление файла по его номеру inode
Дополнительные примеры по использованию команды find вы найдете в Пример 12-22, Пример 3-4 и Пример 10-9. В страницах справочного ркуоводства (man find) вы найдете более подробную информацию об этой достаточно сложной и мощной команде.
Команда передачи аргументов указанной команде. Она разбивает поток аргументов на отдельные составляющие и поочередно передает их заданной команде для обработки. Эта команда может рассматриваться как мощная замена обратным одиничным кавычкам. Зачастую, когда команды, заключенные в обратные одиночные кавычки, завершаются с ошибкой too many arguments (слишком много аргументов), использование xargs позволяет обойти это ограничение. Обычно, xargs считывает список аргументов со стандартного устройства ввода stdin или из канала (конвейера), но может считывать информацию и из файла.
Если команда не задана, то по-умолчанию выполняется echo. При передаче аргументов по конвейеру, xargs допускает наличие пробельных символов и символов перевода строки, которые затем автоматически отбрасываются.
ls | xargs -p -l gzip — упакует с помощью gzip все файлы в текущем каталоге, выводя запрос на подтверждение для каждого файла.
xargs имеет очень любопытный ключ -n NN, который ограничивает количество передаваемых аргументов за один «присест» числом NN.
ls | xargs -n 8 echo — выведет список файлов текущего каталога в 8 колонок.
Еще одна полезная опция — -0, в комбинации с find -print0 или grep -lZ позволяет обрабатывать аргументы, содержащие пробелы и кавычки.
Обе вышеприведенные команды удалят все файлы, содержащие в своем имени комбинацию символов «GUI» . (Спасибо S.C.)
Пример 12-4. Использование команды xargs для мониторинга системного журнала
Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs
Универсальный обработчик выражений: вычисляет заданное выражение (аргументы должны отделяться пробелами). Выражения могут быть арифметическими, логическими или строковыми.
expr 5 % 3
expr 5 \* 3
В арифметических выражениях, оператор умножения обязательно должен экранироваться обратным слэшем.
y=`expr $y + 1`
Операция инкремента переменной, то же самое, что и let y=y+1, или y=$(($y+1)). Пример подстановки арифметических выражений.
z=`expr substr $string $position $length`
Извлекает подстроку длиной $length символов, начиная с позиции $position.
Пример 12-6. Пример работы с expr
Вместо оператора match можно использовать оператор :. Например, команда b=`expr $a : 7*` является точным эквивалентом для b=`expr match $a 8*` в примере, рассмотренном выше.
Этот пример демонстрирует необходимость экранирования оператора группировки — \( . \) в регулярных выражениях, при поиске по шаблону командой expr.
Perl, sed и awk имеют в своем распоряжении более мощный аппарат анализа строк. Коротенький скрипт на sed или awk, внутри сценария (см. Section 33.2) — значительно более привлекательная альтернатива использованию expr при анализе строк.
Дополнительные примеры, по обработке строк, вы найдете в Section 9.2.
Источник
Примеры использования программы find с параметром exec
В прошлой статье я писал о программе locate, удобной для быстрого поиска файлов в системе.
Альтернативой locate является программа find : GNU find обходит каждый файл из дерева директорий, подставляя его имя в заданное выражение и проводит вычисление значения выражения слева до получения результата (правая часть выражения ложна для операции логического «и», истинна для логического «или»), на основании которого find принимает решение о выполнении заданного действия и переходит к рассмотрению следующего имени файла.
Программа find может принимать различные аргументы командной строки для создания выражения поиска, а стандартным действием при обнаружении файла с именем, удовлетворяющим выражению, является печать имени файла.
Перед тем, как как привести полезные примеры использования программы find с параметром exec , рассмотрим немного теоретических положений.
Параметры программы find
Наиболее известными параметрами для поиска файлов при помощи программы find , являются:
-name выражение Это наиболее часто используемый параметр для поиска файлов, имена которых (без учета предшествующих им директорий) удовлетворяют заданному выражению.
-mtime n Файлы были изменены n*24 часов назад.
-uid n Системный числовой идентификатор пользователя-владельца файла должен быть равен n .
Действия
При использовании find есть возможность для указания действий, которые будут выполнены при нахождении файла с именем, удовлетворяющим выражению поиска, а наиболее гибким вариантом, без сомнения, является использование параметра exec .
-exec команда; Выполнить команду; выполнение считается успешным в случае статуса выхода, равного нулю. Все символы, следующие за командой, считаются ее аргументами до того момента, как встречается символ «;» . Строка «<>» заменяется на имя рассматриваемого файла каждый раз, когда она встречается среди аргументов команды.
Примеры использования find с параметром exec
Поиск файлов и удаление их при помощи параметра exec является часто встречающимся вариантом использования этого параметра, но вам не нужно использовать exec для этих целей, так как более удачный вариант будет описан позднее.
В старых системах Unix у вас не будет возможности использовать параметр -delete , поэтому альтернатив параметру -exec для удаления файлов в них не остается.
А теперь рассмотрим некоторые другие примеры использования программы find с параметром exec .
При помощи параметра -type f вы можете вести поиск только файлов и просто изменять права доступа к каждому из них при помощи chmod .
В этом примере я использовал параметр -user как альтернативу параметру -uid .
В этом примере я снова использовал параметр -type , но на этот раз с аргументом d для поиска директорий.
Заключение
Как вы убедились, в приведенных выше примерах показано то, что использование программы find с параметром exec позволяет вам выполнять довольно сложные задачи, при этом то обстоятельство, что вы можете выполнять заданное действие только над частью файлов, ставит вас в выигрышное положение.
Источник
Команда find в Linux – мощный инструмент сисадмина
Иногда критически важно быстро найти нужный файл или информацию в системе. Порой можно ограничиться стандартами функциями поиска, которыми сейчас обладает любой файловый менеджер, но с возможностями терминала им не сравниться.
Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:
Дате добавления.
Содержимому.
Регулярным выражениям.
Данная команда будет очень полезна системным администраторам для:
Управления дисковым пространством.
Бэкапа.
Различных операций с файлами.
Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.
Синтаксис команды find:
directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
criteria (критерий) – критерий, по которым нужно искать файлы;
action (действие) – что делать с каждым найденным файлом, соответствующим критериям.
Поиск по имени
Следующая команда ищет файл s.txt в текущем каталоге:
. (точка) – файл относится к нынешнему каталогу
-name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.
В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.
Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:
Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:
Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.
Поиск по типу файла
Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:
f – простые файлы;
d – каталоги;
l – символические ссылки;
b – блочные устройства (dev);
c – символьные устройства (dev);
p – именованные каналы;
s – сокеты;
Например, указав критерий -type d будут перечислены только каталоги:
Поиск по размеру файла
Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.
«+» — Поиск файлов больше заданного размера
«-» — Поиск файлов меньше заданного размера
Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.
В данном случае поиск выведет все файлы более 1 Гб (+1G).
Единицы измерения файлов:
Поиск пустых файлов и каталогов
Критерий -empty позволяет найти пустые файлы и каталоги.
Поиск времени изменения
Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:
Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).
Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.
Поиск по времени доступа
Критерий -atime позволяет искать файлы по времени последнего доступа.
Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).
Поиск по имени пользователя
Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:
Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.
Поиск по набору разрешений
Критерий -perm – ищет файлы по определенному набору разрешений.
Поиск файлов с разрешениями 777.
Операторы
Для объединения нескольких критериев в одну команду поиска можно применять операторы:
Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:
Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.
Перед скобками нужно поставить обратный слеш «\».
Действия
К команде find можно добавить действия, которые будут произведены с результатами поиска.
-delete — Удаляет соответствующие результатам поиска файлы
-ls — Вывод более подробных результатов поиска с:
Размерами файлов.
Количеством inode.
-print Стоит по умолчанию, если не указать другое действие. Показывает полный путь к найденным файлам.
-exec Выполняет указанную команду в каждой строке результатов поиска.
-delete
Полезен, когда необходимо найти и удалить все пустые файлы, например:
Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.
Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.
command – это команда, которую вы желаете выполнить для результатов поиска. Например:
rm
mv
cp
<> – является результатами поиска.
\; — Команда заканчивается точкой с запятой после обратного слеша.
С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:
Другой пример использования действия -exec:
Таким образом можно скопировать все .jpg изображения в каталог backups/fotos
Заключение
Команду find можно использовать для поиска:
Файлов по имени.
Дате последнего доступа.
Дате последнего изменения.
Имени пользователя (владельца файла).
Имени группы.
Размеру.
Разрешению.
Другим критериям.
С полученными результатами можно сразу выполнять различные действия, такие как:
Удаление.
Копирование.
Перемещение в другой каталог.
Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.