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 find
algo así como grep
con los argumentos foo
, wibble.csv
, &&
, echo
y wibble.csv
. Debe indicarle find
que 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 SOMECOMMAND
es $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 $0
para "$@"
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 &&
, find
puede hacer el trabajo por sí mismo: escriba dos -exec
acciones 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 grep
y echo
son solo para fines ilustrativos, ya que -exec echo
pueden reemplazarse -print
y el resultado resultante no es particularmente útil de todos modos).
-exec
en secuencia o usar uno solo-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.