您面临的问题是外壳程序首先解析命令行,然后看到两个由&&操作符分隔的简单命令:find . -iname \*.csv -exec grep foo {}和echo {} \;。引用&&(find . -iname \*.csv -exec grep foo {} '&&' echo {} \;)绕过,但现在执行的命令find是一样的东西grep的论据foo,wibble.csv,&&,echo和wibble.csv。您需要指示find运行将解释&&操作符的shell :
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
请注意,第一个参数后sh -c SOMECOMMAND是$0不是$1。
通过将命令调用与分组,可以为每个文件节省Shell进程的启动时间-exec … +。为了便于加工,通过一些虚拟的价值$0,使"$@"枚举的文件名。
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
如果shell命令只是两个由分隔的程序&&,则find可以自己完成该工作:编写两个连续的-exec动作,而第二个动作只有在第一个动作以状态0退出时才会执行。
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(我认为grep和echo只是出于说明的目的,-exec echo可以替换为,-print并且最终的输出也不是特别有用。)
-exec依次使用2 或使用一个-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;。