web-dev-qa-db-fra.com

grep excluant le modèle de nom de fichier

J'ai lu Utilisez la syntaxe grep --exclude/- include pour ne pas passer par grep dans certains fichiers
mais dans mon CentOS6.4, quand je le fais 

grep --exclude=*.cmd ckim * -r

Je vois beaucoup de lignes accolées à partir de fichiers * .cmd.
Il semble donc que l'option d'exclusion ne fonctionne pas pour moi.
Qu'est-ce qui ne va pas?
Bien sûr, je peux faire des choses comme 

grep ckim \`find . -name \*.c -print\`

mais je veux savoir pourquoi le grep ne fonctionne pas.

12
Chan Kim

Vous pouvez citer le motif:

grep -r --exclude="*.cmd"  "ckin" ./

PS. ./ est le répertoire courant

27
Tiago Lopo

Utilisez . comme cheminspec au lieu de *.

grep -r --exclude \*.cmd ckim .
3
Timofey Stolbov

vous pouvez aussi faire quelque chose comme ça 

grep -rn ckim * | grep -v '\.cmd'
1
Ajay

Je vois beaucoup de lignes accolées à partir de fichiers * .cmd. Donc, il semble que l'option d'exclusion ne fonctionne pas pour moi.

Il existe une option Shell appelée nullglob qui contrôle l’extension des modèles de Shell en l’absence de fichier correspondant.


Donc, étant donné l'environnement suivant:

sh$ touch f.cmd g.sh
sh$ mkdir sub
sh$ echo ckim > sub/h.cmd
sh$ echo ckim > sub/i.cmd

Sur mon} système (où nullglob est non défini), la commande suivante:

grep --exclude=*.cmd ckim * -r

Est développé ("compris") par Shell comme:

grep --exclude=*.cmd ckim f.cmd g.sh sub -r

C’est-à-dire que je vais recursively (-r) rechercher la chaîne skim commençant par f.cmd, g.sh et sub, mais en excluant tout fichier correspondant au modèle '* .cmd'.

Le résultat est:

# nullglob is unset
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim

MAIS si, dans votre environnement, l'option nullglob est définie, la même commande se développe en:

grep ckim f.cmd g.sh sub -r

Remarquez comment le whole--exclude=... a disparu. Le résultat est donc:

# nullglob is set
sh$ grep --exclude=*.cmd ckim * -r
sub/i.sh:ckim
sub/h.cmd:ckim

Un maintenant, pour l'explication. Lorsque le shell rencontre un motif glob (c'est-à-dire contenant * ou ? ou quelques caractères spéciaux supplémentaires), il le développe avec les fichiers correspondants. Mais s'il n'y a pas de fichiers correspondants, il laisse le modèle tel quel (si nullglob est pas défini) ou le remplace par "rien" (si nullglob est défini).

Ici, le modèle est --include=*.cmdentier car il n'y a pas d'espace dedans). Dans le cas peu probable où vous auriez un fichier correspondant à ce modèle, il aurait été remplacé. Sinon, il est soit laissé "tel quel", soit complètement supprimé - en fonction de nullglob.


Vous pouvez facilement afficher, définir (-s) ou désélectionner (-u) le statut de l'option nullglob de votre bash actuel:

sh$ shopt nullglob
nullglob        on

sh$ shopt -u nullglob
sh$ shopt nullglob
nullglob        off

sh$ shopt -s nullglob
sh$ shopt nullglob
nullglob        on
1
Sylvain Leroux

Si vous souhaitez exclure certains fichiers de grep, vous devez utiliser l'option -l.

grep -l --exclude=*.cmd ckim * -r
0
John B