Команда поиска Unix, что такое {} и \; для?

Для чего в этом наборе команд символы {} и \;?

find . -name '*.clj' -exec grep -r resources {} \;

Обратите внимание, что "grep -r" не требуется, если эти файлы .clj не являются папками. find по умолчанию является рекурсивным, поэтому grep не обязательно. (grep будет загружен в каждый файл.) Вы также можете использовать вместо этого xargs, поскольку с вашей текущей командой вы не узнаете, из каких файлов вы получаете обращения.

PEZ 15.01.2009 18:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
1
4 484
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

См. найти человека. (в частности, про -exec)

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

В вашем примере для всех файлов, найденных в текущем каталоге (.), совпадающих с именем *.clj, будет запущена команда grep -r resources (чтобы найти строку resources, если она существует в каждом из этих файлов).

На самом деле это несколько излишне, поскольку -r предназначен для рекурсивного поиска подкаталогов, и это то, что find уже делает.

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

temporary_user_name 16.05.2019 21:26

В find параметр -exec захватывает остальные параметры до; (точка с запятой), которая должна быть экранирована, следовательно, \ ;. В этом диапазоне {} заменяется проверяемым именем файла.

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

Рассмотрим эту альтернативную команду, которую мне легче понять:

find . -name *.clj | xargs grep -r resources 

Но у которого есть главный недостаток - неправильная обработка файлов со встроенными пробелами и т.п.

jlliagre 18.10.2014 16:36

Строка {} в find заменяется путем к текущему файлу.

Точка с запятой используется для завершения команды оболочки, вызываемой утилитой find.

Он должен быть экранирован или заключен в кавычки, чтобы он не интерпретировался оболочкой, потому что ; является одним из специальных символов, используемых оболочкой (операторами списка).

См. Также: Почему при использовании параметра -exec команды find требуются обратная косая черта и точка с запятой?

Другие вопросы по теме