web-dev-qa-db-fra.com

Pourquoi ce grep pour une chaîne dans tous les sous-répertoires ne fonctionne-t-il pas?

C'est la commande que j'essaye d'exécuter.

grep -r "printf" *.c

J'essaie d'obtenir toutes les lignes printf de tous les fichiers .c présents dans mon cwd. À partir de maintenant, mon répertoire actuel est Bureau et j'ai au moins 10 à 15 fichiers .c dans mes sous-répertoires sous Bureau, mais cette commande ne montre aucune correspondance. Alors, comment puis-je faire ce travail dans ce cas?

4
posixKing

Si tu fais:

grep -r "printf" *.c

le shell étendra *.c à tous les fichiers/répertoires se terminant par .c de votre répertoire actuel. Si ce type de fichier/répertoire n'existe pas, le modèle sera traité de manière littérale (vraisemblablement vous n'avez pas nullglob ensemble).

Comme vous pouvez le constater, votre modèle actuel ne va jamais sous le répertoire actuel, car vous n’avez pas de fichier .c dans le répertoire actuel, ou s’il en existe un, ils ne contiennent pas printf. , conduisant à la sortie vide.

Vous devez utiliser --include pour rechercher dans des fichiers sélectifs uniquement, ainsi que -r pour parcourir récursivement:

grep -r --include="*.c" "printf" .

Ce qui précède cherchera dans tous les fichiers .c la chaîne (motif) printf, à partir du répertoire en cours.

si vous voulez suivre tous les liens symboliques:

grep -R --include="*.c" "printf" .
9
heemayl

Si vous voulez savoir pourquoi votre commande ne fonctionne pas, voir l'autre réponse . Si vous voulez savoir comment le faire fonctionner, voici une autre approche (copié de Grep dans des fichiers avec une extension spécifique dans un répertoire avec des localisations esthétiques) qui utilise les capacités de bash plutôt que celles de grep (et fonctionnera donc pour toute commande, telle que wc, cp ou tar, et pas seulement grep):

S et (allumez) le sh ell opt ion globstar avec la commande

shopt -s globstar

Cela fera que ** en tant que composant du nom de fichier désignera tout ce qui est ici et ci-dessous. Donc, si vous êtes dans Desktop, alors ** signifie tout dans le répertoire Desktop et ses sous-répertoires . Ensuite, vous pouvez utiliser

grep "printf" **/*.c

pour rechercher tous les fichiers .c dans et sous Desktop. Vous n'avez pas besoin de spécifier -r, car le shell effectue la récursion pour vous, et vous n'avez pas besoin de spécifier --include, car le modèle d'expansion du chemin d'accès (aka glob ou wildcard) contient *.c.


Vous pouvez u nset options avec shopt -u.

2
G-Man