Поиск по сайту:

Найдите команду 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.

Статьи по данной тематике: