Что значит & ldquo; {} \; & rdquo; значит в команде Linux?

Иногда я вижу следующую команду:

find . -name  * -exec ls -a {} \;

Меня попросили выполнить это.

Что здесь означает {} \;?

37
задан 9 October 2017 в 10:03

2 ответа

Со страницы руководства для команды find Manpage icon :

-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 и т. Д.

0
ответ дан 9 October 2017 в 10:03

Если вы запускаете 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 отображения файлов в столбцах для последний.

0
ответ дан 9 October 2017 в 10:03

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

Похожие вопросы: