2016-06-21 65 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}“_ {} \;' –