查找-Exec的意外行为



我发现了" find -exec" bash命令的出乎意料的行为,我很喜欢一些解释。可以使用" find ....中的file_name; do ...."循环完成相同的工作,所以问题是为什么它与find的-exec选项不使用。

有两个文件夹(src/and 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/'`"

但是,如果将此命令提供给"查找-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"

那是预期的行为吗?

首先,您的shell对脚本使用sh -c的单语引号。并通过文件名作为sh的参数,而不是在引号中使用{}

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

或bash:

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

相关内容

  • 没有找到相关文章

最新更新