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".
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.
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 "
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 "{}" \;
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.