您面临的问题是外壳程序首先解析命令行,然后看到两个由&&
操作符分隔的简单命令: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"' {} \;
。