El problema que enfrenta es que el shell primero analiza la línea de comando y ve dos comandos simples separados por el &&operador: find . -iname \*.csv -exec grep foo {}y echo {} \;. Citando &&( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;) no pasa por eso, pero ahora el comando ejecutado por findalgo así como grepcon los argumentos foo, wibble.csv, &&, echoy wibble.csv. Debe indicarle findque ejecute un shell que interpretará al &&operador:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Tenga en cuenta que el primer argumento después sh -c SOMECOMMANDes $0, no $1.
Puede guardar el tiempo de inicio de un proceso de shell para cada archivo agrupando las invocaciones de comando con -exec … +. Para facilitar el procesamiento, pase un valor ficticio $0para "$@"enumerar los nombres de archivo.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Si el comando de shell solo tiene dos programas separados &&, findpuede hacer el trabajo por sí mismo: escriba dos -execacciones consecutivas , y la segunda solo se ejecutará si la primera sale con el estado 0.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Supongo que grepy echoson solo para fines ilustrativos, ya que -exec echopueden reemplazarse -printy el resultado resultante no es particularmente útil de todos modos).
-execen secuencia o usar uno solo-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.