2013-09-18 2 views
0

в оболочке Баш под Linux и найти (GNU Findutils) 4.4.2, я пишу:Странное поведение -exec в команде находят

touch FOO 
find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \; 

И я получаю

./FOO ./foo ./FOO 

Почему выход отличается от ./FOO ./foo ./foo?

Сужение проблемы:

find . -name FOO -exec echo `echo {} | tr [A-Z] [a-z]` \; 

дает "./FOO" вместо "./foo"

Я очень озадачен этим.

ответ

4

Оболочка выполняет команду между обратными тиками, прежде чем она запустит find.

Таким образом, find команда, которая фактически выполняется для первой командной строки:

find . -name FOO -exec echo {} ./foo {} \; 

Это должно дать вам выход вы видите:

./FOO ./foo ./FOO 

Вторая команда также выполняет команду между первым обратным тиком, поэтому команда find, которая фактически выполнена для второй командной строки:

find . -name FOO -exec echo {} \; 

, который должен, и делает, эхо ./FOO.

+0

Да, глупо мне ... – juanleon

0

Ваш синтаксис -exec неверен. Используйте:

find . -name FOO -exec bash -c "echo -n {}; echo ' ./FOO' {} | tr '[A-Z]' '[a-z]'" \; 
./FOO ./foo ./foo 
1

Команда выполняется подстановка перед тем выполняется команда find. Это означает, что ваша первая команда

find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \; 

фактически становится

find . -name FOO -exec echo {} ./foo {} \; 

что приводит к

./FOO ./foo ./FOO 

Если вы хотите, чтобы выполнить произвольный код оболочки на результатах вашей находке, вызовите оболочку:

find -name FOO -exec bash -c 'echo "$1" | tr [A-Z] [a-z]' -- {} \; 

(Обратите внимание, что если поиск в текущем каталоге, . ненужно)

Конечно, если все, что вы делаете преобразование в нижнем регистре, было бы лучше сделать это следующим образом:

find -name FOO | tr [A-Z] [a-z] 
Смежные вопросы