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 findquelque chose comme greples arguments foo, wibble.csv, &&, echoet wibble.csv. Vous devez demander findd'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 SOMECOMMANDest $0non $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 $0afin 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 &&, findpeut faire le travail par elle-même: écrire deux -execactions 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 grepet echosont juste à des fins d'illustration, car ils -exec echopeuvent être remplacés par -printet la sortie résultante n'est de toute façon pas particulièrement utile.)
-execen séquence ou utiliser un seul-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.