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.
Vous pouvez citer le motif:
grep -r --exclude="*.cmd" "ckin" ./
PS. ./
est le répertoire courant
Utilisez .
comme cheminspec au lieu de *
.
grep -r --exclude \*.cmd ckim .
vous pouvez aussi faire quelque chose comme ça
grep -rn ckim * | grep -v '\.cmd'
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=*.cmd
(à entier 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
Si vous souhaitez exclure certains fichiers de grep, vous devez utiliser l'option -l
.
grep -l --exclude=*.cmd ckim * -r