J'essaie d'exécuter la commande suivante:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Cela renvoie une erreur:
find: missing argument to -exec
Je ne vois pas ce qui ne va pas avec cette commande, car elle semble correspondre à la page de manuel:
-exec commande {} +
Cette variante de l'option -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est créée en ajoutant à la fin chaque nom de fichier sélectionné; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même manière que xargs construit ses lignes de commande. Une seule instance de '{}' est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.
J'ai aussi essayé:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. Bien que la -exec cmd {} +
variante soit POSIX et soit disponible depuis les années 80, GNU find l'a ajoutée (relativement) récemment (2005). Qu'est-ce que ça find --version
vous dit?
-exec {} +
a été ajouté en 4.2.12 en 2005. Dans les anciennes recherches GNU, vous pouvez utiliser le (non-POSIX) -print0 | xargs -r0
pour obtenir quelque chose de similaire. 4.1
date de 1994.
-name
devraient être cités arguments de motif: -name "*.c" -o -name "*.h"
. C'est vrai, bien que cela ne soit pas lié à l' -exec
erreur. Vous remarquerez que toutes les autres réponses mettent les caractères génériques entre guillemets, bien que seul Gilles le mentionne. … (Suite)
-name "*.[ch]"
sans explication. Cela présente l'avantage de simplifier la ligne de commande et, en particulier, d'éliminer le -o
. Il -o
est difficile de trouver les expressions impliquant impliquant . La tienne a tort; si votre commande est corrigée de manière à ne pas générer d'erreur (comme dans la réponse de Gilles), elle ne s'exécutera grep
que sur les .h
fichiers. Tu dois faire '(' -name '*.c' -o -name '*.h' ')'
.
+
à la fin?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+