find -exec的意外行为

时间:2016-06-21 09:25:40

标签: bash sed find

我发现了一个意外的行为"发现-exec" bash命令,我希望得到一些解释。对于find ....中的file_name,可以使用"完成相同的工作;做...."循环,所以问题是为什么它不能使用find的-exec选项。

有两个文件夹(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

如果在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/'`"

但如果此命令提供给" find -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"

这是预期的行为吗?

1 个答案:

答案 0 :(得分: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}"' _ {} \;