2016-06-21 14 views
1

我發現一個意外的行爲我發現「find -exec」bash命令,我將不勝感激一些解釋。可以用「for file_name in find ....; do ....」循環完成同樣的工作,所以問題是爲什麼它不能與find的-exec選項一起工作。意外的行爲查找-exec

有兩個文件夾(SRC /和src /)具有相同的一組文件。我想比較這些文件夾中的文件:

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

但是,這並不會比較文件...由於某些原因,sed命令不會進行替換。如果只有一個文件,例如,「一」,在每一個這樣的文件夾,然後在命令

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

輸出

src/a src/a 

如果一個人確實在bash類似的事情,下面所有的命令給出相同的結果(SRC/A):

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/A」

那是預期的行爲?

+4

你爲什麼不使用'差異-r SRC src'? – GMichael

+0

Escape'\''as'\\'' – anishsane

+0

@Michael這是一個很好的觀點,但它並不回答我的問題。回答你的問題:最初我想在最後得到一些令人想起emacs -q --eval'(ediff-merge-files「file2」「file2」)的東西,但是意識到find有問題...然後簡化爲這個例子.... – Mitya

回答

1

sh -c使用單引號,腳本首先由shell解釋。並通過文件名作爲參數爲sh,而不是使用{}引號內:

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

或者使用bash:

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}「_ {} \;' –