Le problème auquel vous êtes confronté est que le shell analyse d'abord la ligne de commande et voit deux commandes simples séparées par l' &&
opérateur:, find . -iname \*.csv -exec grep foo {}
et echo {} \;
. Citant &&
( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
) court - circuite, mais maintenant la commande exécutée par find
quelque chose comme grep
les arguments foo
, wibble.csv
, &&
, echo
et wibble.csv
. Vous devez demander find
d'exécuter un shell qui interprétera l' &&
opérateur:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Notez que le premier argument après sh -c SOMECOMMAND
est $0
non $1
.
Vous pouvez enregistrer l'heure de démarrage d'un processus shell pour chaque fichier en regroupant les appels de commandes avec -exec … +
. Pour faciliter le traitement, transmettez une valeur fictive $0
afin d' "$@"
énumérer les noms de fichier.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Si la commande shell n'est que de deux programmes séparés par &&
, find
peut faire le travail par elle-même: écrire deux -exec
actions consécutives , et la seconde ne sera exécutée que si la première se termine avec le statut 0.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Je suppose que grep
et echo
sont juste à des fins d'illustration, car ils -exec echo
peuvent être remplacés par -print
et la sortie résultante n'est de toute façon pas particulièrement utile.)
-exec
en séquence ou utiliser un seul-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;
.