我正在尝试运行以下命令:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
这将返回错误:
find: missing argument to -exec
我看不到此命令出了什么问题,因为它似乎与手册页匹配:
-exec命令{} +
-exec选项的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将远远少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅允许使用一个'{}'实例。该命令在起始目录中执行。
我也尝试过:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
。尽管该-exec cmd {} +
变体是POSIX,并且自80年代就已经可用,但是GNU发现(相对)只是最近才添加了它(2005年)。是什么find --version
告诉你吗?
-exec {} +
是在2005年的4.2.12中添加的。在较早的GNU发现中,您可以使用(非POSIX)-print0 | xargs -r0
获得类似的内容。4.1
是从1994
-name
应该将模式参数引用为:-name "*.c" -o -name "*.h"
。这是正确的,尽管它与-exec
错误无关。您会注意到,所有其他答案都将通配符放在引号中,尽管只有Gilles提及了它。…(续)
-name "*.[ch]"
没有任何解释。这样的好处是简化了命令行,特别是消除了 -o
。查找涉及-o
的表达式很难正确。你错了 如果您的命令是固定的,因此不会出错(如Gilles的回答),它将grep
仅在.h
文件上运行。你需要做'(' -name '*.c' -o -name '*.h' ')'
。
+
?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+