Obtenir l'erreur "xargs unterminated quote" lorsque vous essayez d'imprimer le nombre de lignes dans le terminal

Je veux obtenir le nombre de lignes dans mon application. J'utilise ce code:

find . "(" -name "*.m" -or -name "*.h" ")" -print | xargs wc -l

Cela fonctionne bien dans d'autres applications mais pour l'une de mes applications, il donne l'erreur "xargs unterminated quote".

24
demandé sur Krinkle 2012-07-25 16:37:23

4 réponses

L'un de vos noms de fichiers contient-il une citation? Essayez quelque chose comme ceci:

find . "(" -name "*.m" -or -name "*.h" ")" -print0 | xargs -0 wc -l

L'argument -print0 indique à find d'utiliser le caractère NULL pour terminer chaque nom qu'il imprime. L'argument -0 indique à xargs que ses jetons d'entrée sont terminés par NULL. Cela évite les problèmes avec les caractères qui seraient autrement traités comme spéciaux, comme les guillemets.

54
répondu Gary G 2014-11-11 18:50:59

Cela peut se produire parce que vous avez une seule citation dans un nom de fichier quelque part...

Ie -> '

Pour trouver le fichier de problème, exécutez ce qui suit dans le terminal:

\find . | grep \' 

Et cela peut aussi arriver si vous avez un alias pour la configuration xargs qui cause un problème. Pour tester si c'est le cas, exécutez simplement xargs avec un ' \ ' devant, par exemple

\find . | \xargs ....

Le " \ "signifie simplement" exécuter la commande sans alias "

7
répondu Brad Parks 2016-03-01 20:01:18

La façon canonique de résoudre les problèmes de guillemets, d'espaces et de caractères spéciaux lors de l'utilisation de find consiste à utiliser l'option -exec au lieu de xargs.

Pour votre cas, vous pouvez utiliser:

find . "(" -name "*.m" -or -name "*.h" ")" -exec wc -l "{}" \;
0
répondu Ortomala Lokni 2018-09-09 09:41:20

Après quelques bricolages, j'ai trouvé que cette commande fonctionnait pour moi (parce que j'avais des espaces et des citations inégalées dans Mes noms de fichiers):

find . -iname "*USA*" -exec cp "{}" /Directory/to/put/file/ \;

. fait référence à l'emplacement où la recherche est en cours

-iname suivi de l'expression fait référence aux critères de correspondance

-exec cp "{}" /Directory/to/put/file/ \; indique à la commande d'exécuter la commande copy où chaque fichier trouvé via -iname remplace "{}"

Vous avez besoin du \; pour indiquer à la commande exec que l'instruction cp est terminer.

0
répondu ngopal 2018-09-23 03:13:12