2010-08-13 4 views
1

Je les apostrophes inverses je tente d'échapper à des personnages dans backticks dans ma commande bash, principalement pour gérer les espaces dans les noms de fichiers qui provoquent ma commande à l'échec.Bash: échapper personnages

La commande que j'ai à ce jour est:

grep -Li badword `grep -lr goodword *` 

Cette commande devrait se traduire par une liste de fichiers qui ne contiennent pas le mot « BADWORD » mais qui ne contiennent « GoodWord ».

+2

[Ne pas utiliser les guillemets.] (Http://mywiki.wooledge.org/BashFAQ/082) –

+1

Cette question est sur la première page de Google pour "bash escape backtick", elle mérite donc une réponse à la question. question (comment échapper les caractères en arrière dans bash). –

Répondre

3

Votre approche, même si vous obtenez la fuite à droite, se heurter à des problèmes lorsque le nombre de fichiers émis par le goodwordgrep atteint les limites de longueur de ligne de commande . Il est préférable de diriger la sortie du premier grep sur un second grep, comme celui-ci

grep -lr -- goodword * | xargs grep -Li -- badword 

Cela gérer correctement les fichiers avec des espaces, mais il échouera si un nom de fichier a une nouvelle ligne en elle. Au moins GNU grep et xargs support séparant les noms de fichiers avec des octets NUL, comme ce

grep -lrZ -- goodword * | xargs -0 grep -Li -- badword 

EDIT: deux tirets Ajouté -- à grep invocations pour éviter le cas lorsque certains noms de fichiers commencent par - et seront interprétées par grep comme options supplémentaires.

+0

Merci pour le conseil! Je reçois toujours un comportement étrange. Lorsque je tente d'exécuter cette commande, je reçois la sortie suivante: racine @ domaine [/ path] # grep -lrZ GoodWord * | xargs -0 grep -Li BADWORD grep: option non valide - k Utilisation: grep [OPTION] ... MODÈLE [FICHIER] ... Essayez 'grep --help » pour plus d'informations. (entrée standard) –

+0

@Ian: Avez-vous un fichier dont le nom commence par un '-' dans le répertoire? Dans ce cas, n'oubliez pas d'ajouter également '--' avant les arguments réels de' grep'. J'ai modifié la réponse en conséquence. – JaakkoK

+0

Génial - cela a totalement fonctionné. Merci beaucoup. –

1

Que diriez-vous récrire à:

grep -lr goodword * | grep -Li badword 
+1

Votre suggestion affichera les fichiers où le fichier contient 'goodword' et le fichier _NAME_ ne contient pas' badword' – JaakkoK

+0

C'est vrai; il a besoin d'un xargs ... Merci de le signaler :) –