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?
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" .
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
.