Кто-то может объяснить меня поведение команды находки, которое я использую?

Может любой говорить мне, почему следующая команда не будет работать:

find ./assign/*.c -exec cp ./assign2 {} \;

и что является различием, когда я делаю следующее (который на самом деле работает):

find ./assign -type f -name *.c  -exec cp {} ./assign2 \;
1
задан 5 September 2012 в 11:10

2 ответа

find ./assign/*.c -exec cp ./assign2 {} \;

Подстановочный знак (*) расширен оболочкой прежде, даже находка выполняется. Скажите, что существует два файла, source1.c и source2.c в присваивать каталоге, затем вышеупомянутое эквивалентно

find ./assign/source1.c ./assign/source2.c -exec cp ./assign2 {} \;

Это любой ценой допустимо, и означает, что Вы только хотите сделать что-то с этими конкретными файлами. Например, Вы могли записать

find ./assign/*.c -name '*2*'

и результат был бы примерно эквивалентен ls ./assign/*.c | grep 2 или ls ./assign/*2*.c.

Обратите внимание, что, если Вы не хотите, чтобы оболочка развернула подстановочные знаки, необходимо поместить их в кавычки:

find "./assign/*.c"

Однако это перестанет работать, как находят обработки путем буквально (без любого подстановочного расширения), таким образом, это буквально ищет названный файл *.c (да, который является допустимым именем файла).

Что касается второй части Вашего первого выражения (exec cp ./assign2 {} \;). Очевидно, существует опечатка, так как команда CP пытается скопировать assign2 каталог во второй аргумент. Учитывая, что у Вас есть файлы source1.c и source2.c в присваивать каталоге, результат Вашей команды будет эквивалентен

cp assign2/ ./assign/source1.c
cp assign2/ ./assign/source2.c

Который является, вероятно, не, что Вы предназначили (также, это перестанет работать, потому что Вы не можете скопировать каталог в имя файла).

Теперь, для второго выражения, потому что существует проблема здесь также:

find ./assign -type f -name *.c  -exec cp {} ./assign2 \;

Это будет работать, только при отсутствии файлов с .c расширение в текущем каталоге. Иначе оболочка расширится *.c. Скажите, у Вас есть следующие файлы:

./master.c
./assign/source1.c
./assign/source2.c

Вышеупомянутая командная строка будет сначала расширена оболочкой до

find ./assign -type f -name master.c -exec cp {} ./assign2 \;

Это перестанет работать, потому что нет никакого файла master.c в присваивании / каталог. Вместо этого используйте

find ./assign -type f -name "*.c" -exec cp {} ./assign2 \;

В любом случае, если у Вас нет сложной структуры каталогов под./присваивать или каталоги тот конец в .c, Я быть бы просто

cp ./assign/*.c ./assign2
3
ответ дан 21 October 2019 в 11:03

Для "находки" необходимо указать в порядке:

  • , где искать (./присваивать)
  • тип документа (-тип f иначе файл), но это дополнительное
  • название документа (-называют *.c иначе каждым файлом с расширением =.c), и это не дополнительное

Затем Вы говорите, "находят", что после поиска это должно выполнить определенную команду (-должностное лицо), и синтаксис для "CP" правилен на обеих командах, которые Вы даете, но так как синтаксис для "находки" в первой является неправильным, первый не будет работать.

BTW, я не думаю ни один, который, после нахождения всех.c файлов, действительно имеет любой смысл копировать каталог./assign2 в фактическое открытие ({}), а скорее наоборот. Таким образом, по моему скромному мнению, это, даже если синтаксис правилен, команда "CP" в первой строке, ничего не делает.

2
ответ дан 21 October 2019 в 11:03

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

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