2016-06-21 8 views
1

Я нашел неожиданное для меня поведение команды «find -exec» bash, и я был бы признателен за некоторую интерпретацию. То же самое задание можно выполнить с помощью «для имени_файла в find ....; do ....», поэтому вопрос заключается в том, почему он не работает с опцией -exec find.Неожиданное поведение find -exec

Есть две папки (SRC/и src /) с одним и тем же набором файлов. Я хочу, чтобы сравнить файлы в этих папках:

find src/ -type f -exec sh -c "diff {} `echo {} | sed 's/src/SRC/'`" \; 

это, однако, не сравнить файлы ... какой-то причине СЭД команды не делает замену. Если есть только один файл, например, «а», в каждом из этого папки, то команда

find src/ -type f -exec sh -c "echo {} `echo {} | sed 's/src/SRC/'`" \; 

выходы

src/a src/a 

если один делает подобную вещь в Баше, все следующие команды дают тот же результат (SRC/а):

echo src/a | sed 's/src/SRC/' 
echo `echo src/a | sed 's/src/SRC/'` 
sh -c "echo src/a | sed 's/src/SRC/'" 
sh -c "echo `echo src/a | sed 's/src/SRC/'`" 

но если эти команды поступают на "найти -exec ..." выходы различны:

find src/ -type f -exec bash -c "echo {} | sed 's/src/SRC/'" \; 

дает "SRC/A"

и

find src/ -type f -exec bash -c "echo `echo {} | sed 's/src/SRC/'`" \; 

дает "SRC/а"

Это ожидаемое поведение?

+4

Почему вы не используете 'дифф -r SRC src'? – GMichael

+0

Escape '\' 'как' \\ '' – anishsane

+0

@ Майкл, это хороший момент, но он не отвечает на мой вопрос. Чтобы ответить на ваш вопрос: изначально я хотел получить в конце что-то, вызывающее emacs -q --eval '(ediff-merge-files "file2" "file2")', но понял, что что-то не так с find ... Тогда приведенный к этому примеру .... – Mitya

ответ

1

Использовать одинарные кавычки для sh -c для скрипта интерпретируется вашей оболочкой в ​​первую очередь. И передать имя файла в качестве аргумента для sh вместо использования {} внутри кавычек:

find src/ -type f -exec sh -c 'diff "$1" "$(printf "%s\n" "$1" | sed "s/src/SRC/")"' _ {} \; 

Или с Баш:

find src/ -type f -exec bash -c 'diff "$1" "${1/src/SRC}"' _ {} \; 
+0

Мне понравился второй метод +1 – sjsam

+1

Вам действительно не нужен Bash в этом конкретном случае: 'find src/-type f -exec sh -c 'diff" $ 1 "" SRC $ {1 # src} "' _ {} \; ' –

Смежные вопросы