2016-06-21 24 views
1

"find -exec" bashコマンドの予期せぬ動作があることがわかりました。同じ仕事は "for file_name in find ....; do ...."ループで行うことができます。なぜなら、問題はfindの-execオプションではうまくいかないからです。find -execの予期しない動作

同じファイルセットを持つ2つのフォルダ(SRC /とsrc /)があります。私は、これらのフォルダ内のファイルを比較したい:

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

これは、しかし、置換ことはありませんいくつかの理由のsedコマンドのためにファイルを...比較しません。一つだけのファイル、例えば、「A」は、こののそれぞれに、存在する場合はフォルダ、コマンド

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

出力

src/a src/a 

1は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 /"

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

を与えるには、 "SRC /"

が予想される動作ということです提供しますか?

+4

は、なぜあなたは使用しない 'diffを-r SRC src'? – GMichael

+0

エスケープ '\' '' \\ '' – 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/")"' _ {} \; 

やbashでの:

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

私は第2の方法が好き+1 – sjsam

+1

この非常に特殊なケースでは、Bashは本当に必要ありません:find src/-type f -exec sh -c 'diff "$ 1" "SRC $ {1#src}"' {} \; ' –