Что значит \; значит в следующей команде? Я также не уверен, что означает {} . Есть \; действительно необходимо?

find ./ -name file_1 -exec cp {} ./ \;

3 ответа3

6

В вашем примере \; является частью команды поиска. (см. человек 1 найти). То же самое верно для {} .

Эта точная команда гласит:

  • Найти все в текущем каталоге (точка или в вашем случае ./)
  • Где имя файла или каталога file_1
  • И затем выполните следующую команду: cp {} ./
    где {} заменит найденный файл или каталог.

В результате все файлы и каталоги с именем file_1 будут скопированы в ваш текущий каталог. (и они могут быть перезаписаны, если существует несколько файлов или папок с таким именем)


Так много для общего объяснения. Теперь подробности:

Команда, которая будет выполняться для каждого найденного элемента : cp full_path_to_item./
Это содержимое между -exec и ;

Однако точка с запятой - это особый символ в bash. Если мы не сделаем с этим ничего особенного, то оболочка его съест. Таким образом, мы избежим этого с обратной косой чертой. Это говорит оболочке оставить это в покое и передать это, чтобы найти.


Обратите внимание, что вам нужно будет сделать это для всех специальных символов. Например, вы не можете просто использовать звездочку в имени файла (так что не найти. -Type f -name * .mp3 ....)

3

Причина того, что точку с запятой нужно экранировать, заключается в том, что она будет интерпретироваться оболочкой, а не командой find если она не экранирована. find ожидает увидеть это в своей командной строке, поэтому обратная косая черта говорит оболочке игнорировать ее и передавать ее для find . Очень важно find точку с запятой, иначе она выдаст ошибку.

{} также интерпретируется с помощью find . Это заполнитель вы положили в команде , которую вы хотите запустить, и каждый файл find находит, он заменит эти два кронштейн с именем файла и запустить команду.

В вашем примере, если он нашел file_1, будет выполнена следующая команда:

cp file_1 ./
1

{} \; имеет не столько отношение к оболочке, сколько к аргументам, которые команда find ожидает от подкоманды -exec. {} Заменяется текущим именем файла, например, это приводит к тому, что find выполняет команду ls -d FILENAME с заменой FILENAME на каждый найденный файл. \; служит терминатором аргумента -exec. См. Справочную страницу поиска, например, введите man find в оболочке linux и найдите там строку -exec, чтобы найти описание.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .