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 '{}' \+
+
à la fin?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 çafind --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écuteragrep
que sur les.h
fichiers. Tu dois faire'(' -name '*.c' -o -name '*.h' ')'
.Réponses:
Vous devez supprimer les guillemets simples que vous utilisez
{}
. La commande peut être simplifiée comme ceci:Si vous utilisez une version de recherche GNU archaïque, cela devrait toujours fonctionner:
la source
{}
n'ont pas de signification spécifique pour le shell.«Argument manquant à
-exec
» signifie généralement que l'argument à -exec
manque son terminateur. Le terminateur doit être soit un argument contenant uniquement le caractère;
(qui doit être cité dans une commande shell, il est donc généralement écrit\;
ou';'
), soit deux arguments successifs contenant{}
et+
.Stephane Chazelas a identifié que vous utilisez une ancienne version de GNU find qui ne prend pas en charge
-exec … {} +
uniquement-exec {} \;
. Bien que GNU ait été un adopteur tardif-exec … {} +
, je recommande que vous obteniez une suite d'outils moins ancienne (comme Cygwin , qui comprend git et bien plus encore, ou GNUwin32 , qui manque de git mais n'a pas le mauvais employé qui essaie -à-utiliser-linux-mais-nous-imposons-vibe windows que Cygwin donne). Cette fonctionnalité a été ajoutée dans la version 4.2.12, il y a plus de 9 ans (c'était la dernière fonctionnalité identifiée pour faire GNUfind
POSIX compatible).Si vous souhaitez vous en tenir à une ancienne recherche GNU, vous pouvez utiliser
-print0
avecxargs -0
pour obtenir une fonctionnalité similaire: exécution de commandes groupées, prise en charge de noms de fichiers arbitraires.Citez toujours les caractères génériques sur la
find
ligne de commande. Sinon, si vous exécutez cette commande à partir d'un répertoire contenant des.c
fichiers, le caractère non cité*.c
serait étendu à la liste des.c
fichiers du répertoire actuel.L'ajout
/dev/null
à lagrep
ligne de commande est une astuce pour s'assurer que grep imprimera toujours le nom du fichier, même s'ilfind
arrive de trouver une seule correspondance. Avec GNU find, une autre méthode consiste à passer l'option-H
.la source
Si une commande telle que
renvoie une erreur
la cause probable est un GNU trop ancien
find
qui ne prend pas en charge la syntaxe-exec mycommand {} +
. Dans ce cas, le remplacement à faible performance doit s'exécuter,-exec mycommand {} \;
ce qui exécuteramycommand
une fois pour chaque cible trouvée au lieu de collecter plusieurs cibles et d'exécuter lemycommand
seule fois.Cependant, GNU
find
ne prend pas en charge par exemplecar GNU
find
ne prend en charge que les combinaisons littérales{} +
au lieu de plus génériques{} additional parameters +
. Notez qu'il ne peut rien y avoir entre les accolades et le+
caractère. Si vous essayez ceci, vous obtiendrez la même erreur:La solution consiste à utiliser une syntaxe
{} additional parameters \;
qui fonctionne mais qui exécutera la commande une fois pour chaque cible trouvée. Si vous avez besoin de plus de performances avec GNU,find
vous devez écrire un script wrapper qui peut ajouter des paramètres supplémentaires aux arguments donnés. Quelque chose commedevrait être assez bon. Ou, si vous ne souhaitez pas créer de fichier temporaire, vous pouvez utiliser une ligne pour modifier l'ordre des paramètres comme ceci:
qui s'exécutera
mycommand {list of ttf files} extra arguments
. Notez que vous devrez peut-être doubler les caractères spéciaux d'échappement pour le bash après le-c
drapeau.la source
find
, mais le comportement correct spécifié par POSIX .find
vous avez probablement GNUcp
. Dans ce cas, vous pouvezfind ... -exec cp --target-directory ~/.fonts {} +
conserver le{}
à la fin de la chaîne d'exécution.find . -type f -perm 0777 -exec chmod 644 {}\;
a obtenu une erreur
find: missing argument to ``-exec'
.Ajouter de l'espace entre
{}
et\
corrigé:find . -type f -perm 0777 -print -exec chmod 644 {} \;
la source
find
commande dans la question à l'étude.+
forme de l'-exec
option pourfind
. Cette réponse corrige un problème que l'utilisateur posant la question n'a pas.J'ai eu ma part de maux de tête avec la syntaxe exec dans le passé. la plupart du temps, je préfère la syntaxe bash la plus agréable:
Il a certaines limites lorsque vous souhaitez traiter les fichiers en tant que groupe, car chacun est évalué en série, mais vous pouvez très bien diriger la sortie ailleurs
la source
find … -exec … \;
, donc il n'y a aucune raison de l'utiliser même si vous savez que vos noms de fichiers sont apprivoisés.exec
était trop un casse-tête pour les 5 minutes que je voulais y consacrer. Mes noms de fichiers étaient apprivoisés et cela a résolu mon problème :)