Найдите команду Exec в Linux: 9 полезных примеров
Find работает над поиском файлов по ряду критериев. Команда exec дает вам возможность работать над этими результатами. Вот несколько примеров комбинации команд find exec.
Команда find в Linux — отличный инструмент для поиска файлов и каталогов по заданным критериям.
Вы можете вывести свои результаты на новый уровень, фактически выполняя определенные операции с найденными файлами.
Например, вы нашли все файлы с расширением .jpeg. Как насчет переименования их с расширением .jpg?
Вы не можете просто перенаправить вывод команды find на другую команду. Это не сработает так просто.
У вас есть два способа выполнить другие команды по результату команды find:
использовать xargs
использовать exec
Подробная статья о команде xargs уже есть. В этом руководстве основное внимание будет уделено комбинированию команд find и exec.
Использование команды exec с выводом команды find
Основной синтаксис для выполнения find с помощью exec следующий:
find [path] [arguments] -exec [command] {} \;
Вот краткое объяснение:
[команда] — это то, что вы хотите выполнить над результатами, полученными командой find.
{} — это заполнитель, который используется для хранения результатов, полученных командой find.
\; сообщает, что для каждого найденного результата выполняется [команда] . Вам нужно избежать ; здесь и отсюда \;.
Существует еще один синтаксис, который немного отличается от приведенного выше и выглядит следующим образом:
find [path] [arguments] -exec [command] {} +
Здесь + говорит, что для каждого результата команды find [команда] выполняется только один раз. Все результаты передаются [команде] вместе как аргументы. +
не обязательно экранировать с помощью \+
.
Все еще не понимаете, как использовать {} \;
и {} +
?
{} \;
выглядит следующим образом (выполнение команд для каждого найденного результата):
ls file1.txt
ls file2.txt
ls file3.txt
{} +
выглядит следующим образом (однократное выполнение команды со всеми аргументами результатов):
ls file1.txt file2.txt file3.txt
Хотя может показаться, что использование {} +
здесь лучший вариант, на самом деле все наоборот. Если команды поиска выдают 50 результатов, вы не можете передать их все вместе в качестве аргументов, поскольку существуют ограничения на максимальную длину командной строки.
Вот почему вам лучше использовать {} \;
, если вы точно не знаете, что вам нужно.
Практические примеры сочетания команд find и exec
Позвольте мне поделиться некоторыми распространенными примерами команд find exec, чтобы вы могли лучше их понять.
1. Найдите и отобразите атрибуты файла.
В первом простом примере команды find exec я собираюсь отобразить все файлы блокировки, находящиеся в каталоге /tmp, и их свойства.
sudo find /tmp/ -type f -name *lock -exec ls -l {} \;
Вот результат:
sagar@LHB:~$ sudo find /tmp/ -type f -name *lock -exec ls -l {} \;
-r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1024-lock
-r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1025-lock
2. Найдите и переименуйте файлы
Да, используя find with exec, вы можете легко переименовывать файлы. Команда mv используется для переименования файлов. Я буду делать то же самое.
sudo find /home/sagar/Downloads/ -type f -name 'ubuntu*' -exec mv {} {}_renamed \;
Приведенная выше команда находит файлы, имена которых начинаются с ubuntu, и сохраняет их внутри заполнителя. После процесса сохранения результатов внутри заполнителя в конце каждого файла, хранящегося внутри заполнителя, будет добавлено «_renamed».
3. Собирайте и храните размеры файлов.
В этом примере я покажу вам, как можно собрать размер доступных файлов в определенном каталоге и создать файл для сохранения полученных результатов.
Я соберу размер каждого файла в каталоге /tmp и сохраню результат в каталоге /root с именем файла du_data.out.
sudo find /tmp/ -type f -exec du -sh {} \; > /root/du_data.out
Теперь давайте посмотрим, как выглядит недавно созданный файл в каталоге /root.
4. Удалить файлы с определенными параметрами
Будьте особенно осторожны при автоматическом удалении файлов. Если не обратить внимания, это может привести к катастрофе. Либо используйте интерактивное удаление с помощью rm -i
, либо сначала посмотрите результат команды find.
Другой распространенный пример комбинации команд find exec — поиск файлов, размер которых превышает определенный, и их удаление. Это хорошо работает, если вы чистите старые журналы.
Я удаляю файлы размером более 100 МБ для демонстрации из каталога «Рабочий стол».
find ~/Desktop -size +100M -exec rm {} \;
Аналогичным образом вы также можете удалять файлы в зависимости от их возраста. Например, давайте удалим файлы старше 10 дней.
sudo find /tmp/ -type f -mtime +10 -exec rm {} \;
Здесь я использовал -mtime, который идентифицирует данные, измененные за последние 24 часа, и в сочетании с ним +10 он нашел и удалил файлы старше 10 дней.
5. Используйте специальные инструменты
Существуют различные случаи, когда вам может потребоваться запустить определенные инструменты или пакеты после обнаружения файлов.
Например, когда я ищу какой-либо mp3-файл, я хочу запустить id3v2, который предоставит подробную информацию о найденном mp3-файле.
find . -name "*.mp3" -exec id3v2 -l {} \;
id3v2 — это пакет, который покажет подробную информацию о mp3-файле, а -l используется для отображения каждого mp3-тега, связанного с найденным mp3-файлом.
6. Измените владельца файлов и каталогов.
Изменение владельца файлов и каталогов — еще один пример того, насколько мощной является комбинация find и exec.
Здесь я ищу файлы, принадлежащие пользователю с именем sagar
, а затем меняю их владельца на milan
.
sudo find /home/sagar/disk/Downloads -user sagar -type f -exec chown milan {} \;
7. Изменение разрешения файлов
А как насчет изменения прав доступа к файлам с помощью find и exec?
sudo find /home/sagar/disk/Downloads -type f -exec chmod 644 {} \;
В приведенной выше команде я использовал -type f, поэтому команда будет применяться только к файлам в данном каталоге.
8. Соберите md5sum для каждого файла.
В этом примере я покажу, как можно собрать сумму md5 для каждого доступного файла в каталоге /tmp.
sudo find /tmp/ -type f -exec md5sum {} \;
Как видите, примененная команда собрала md5sum для каждого доступного файла с их именами и md5sum.
Но что, если вы хотите сохранить этот вывод и напрямую под другим именем? вам просто нужно следовать данной команде и соответствующим образом изменять имена:
sudo find /tmp/ -type f -exec md5sum {} \; > /Documents/checksumdata.out
9. Объедините exec с командой grep
Команда find работает с именами файлов. Команда grep работает с содержимым файлов.
Объедините find и grep вместе с exec, и вы получите мощный инструмент поиска в командной строке Linux.
Например, команда ниже ищет все файлы с расширением .hbs
. С помощью grep он ищет в содержимом этих файлов .hbs строку «выдержка».
find . -type f -name "*.hbs" -exec grep -iH excerpt {} \;
С опцией -H
команда grep покажет имена файлов для каждого совпадения. Вот результат:
sagar@LHB:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec grep -iH excerpt {} \;
./author.hbs: <div class="post-card-excerpt">{{bio}}</div>
./partials/post-card.hbs: {{#if excerpt}}
./partials/post-card.hbs: <div class="post-card-excerpt">{{excerpt}}</div>
./post.hbs: {{#if custom_excerpt}}
./post.hbs: <p class="article-excerpt">{{custom_excerpt}}</p>
./tag.hbs: <div class="post-card-excerpt">
Дополнительный совет: поиск с помощью нескольких команд exec
Да, вы можете объединить несколько команд exec с одной командой поиска.
Позвольте мне взять тот же пример, который вы видели в предыдущем разделе, и использовать две команды exec.
find . -type f -name "*.hbs" -exec echo {} \; -exec grep excerpt {} \;
Сначала он выполнит поиск файлов .hbs, а затем выведет их имя с помощью первой команды exec. И затем в этих файлах будет выполняться поиск по строке «отрывок».
Вывод будет немного отличаться от вывода предыдущей команды:
sagar@LHB:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec echo {} \; -exec grep excerpt {} \;
./index.hbs
./page.hbs
./default.hbs
./author.hbs
<div class="post-card-excerpt">{{bio}}</div>
./error-404.hbs
./error.hbs
./partials/icons/twitter.hbs
./partials/icons/fire.hbs
./partials/icons/lock.hbs
./partials/icons/loader.hbs
./partials/icons/rss.hbs
./partials/icons/avatar.hbs
./partials/icons/facebook.hbs
./partials/post-card.hbs
{{#if excerpt}}
<div class="post-card-excerpt">{{excerpt}}</div>
./post.hbs
{{#if custom_excerpt}}
<p class="article-excerpt">{{custom_excerpt}}</p>
./tag.hbs
<div class="post-card-excerpt">
Заключение
Find — уже мощная команда для поиска файлов по ряду критериев. Команда exec дает вам возможность работать с результатом команды find.
Примеры, которыми я здесь поделился, — это всего лишь беглый взгляд. Вместе комбинация команд find-exec дает вам безграничные возможности для выполнения действий в командной строке Linux.