我发现了一个意外的行为"发现-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"
这是预期的行为吗?
答案 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}"' _ {} \;