Иногда я вижу следующую команду:
find . -name * -exec ls -a {} \;
Меня попросили выполнить это.
Что здесь означает {} \;
?
Со страницы руководства для команды find
:
-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to
the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current
file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or
quoted to protect them from expansion by the shell.
Итак, вот объяснение:
{}
означает « выход find
". Как и в «что бы то ни было find
найдено». find
возвращает путь к файлу, который вы ищете, верно? Таким образом, {}
заменяет его; это заполнитель для каждого файла, который находит команда find
(взято из здесь ).
Часть \;
в основном говорит find
: «Хорошо, я закончил с командой, которую хотел выполнить».
Допустим, я нахожусь в каталоге, полном .txt
файлов. Затем я запускаю:
find . -name '*.txt' -exec cat {} \;
Первая часть, find . -name *.txt
, возвращает список файлов .txt
. Вторая часть, -exec cat {} \;
будет выполнять команду cat
для каждого файла, найденного с помощью find
, поэтому cat file1.txt
, cat file2.txt
и т. Д.
Если вы запускаете find
с exec
, {}
раскрывается до имени файла каждого файла или каталога, найденного с помощью find
(так что ls
в вашем примере получает каждое найденное имя файла в качестве аргумента - обратите внимание, что он вызывает ls
или любую другую команду, указанную вами один раз для каждого найденного файла).
Точка с запятой ;
завершает команду, выполненную exec
. Его нужно экранировать с помощью \
, чтобы оболочка, внутри которой вы запускаете find
, не воспринимала его как свой собственный специальный символ, а передавала его find
.
См. эту статью для более подробной информации.
Кроме того, find
обеспечивает некоторую оптимизацию с помощью exec cmd {} +
- при таком запуске find
добавляет найденные файлы в конец команды, а не вызывает ее один раз для каждого файла (так что команда запускается только один раз, если это возможно).
Разница в поведении (если не в эффективности) легко заметна, если работать с ls
, например
find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
Предполагая, что у вас есть несколько jpg
файлов (с достаточно короткими путями ), результатом будет одна строка на файл в первом случае и стандартное поведение ls
отображения файлов в столбцах для последний.