【发布时间】:2016-10-22 18:28:42
【问题描述】:
我发现“find -exec” bash 命令的行为出乎我的意料,我将不胜感激。同样的工作可以用“for file_name in find ....; do....”循环来完成,所以问题是为什么它不适用于 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”
这是预期的行为吗?
【问题讨论】:
-
你为什么不用
diff -r SRC src? -
转义
`为\` -
@Michael 这是一个很好的观点,但它没有回答我的问题。回答你的问题:最初我想在最后得到一些唤起 emacs -q --eval '(ediff-merge-files "file2" "file2")' 的东西,但意识到 find 有问题......然后简化为这个例子......
-
如果 shell 命令太长,那么更好的选择是函数。