Grep, исключая шаблон имени файла

Я читал Использовать grep --exclude/- включить синтаксис, чтобы не grep через определенные файлы
но в моем CentOS6.4, когда я делаю

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

Я вижу много строк grepped из *.cmd файлов.
поэтому кажется, что вариант исключения не работает для меня.
Что не так? конечно, я могу делать такие вещи, как

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

но я хочу знать, почему grep не работает.

Ответ 1

Вы можете процитировать шаблон:

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

PS. ./ - текущий каталог

Ответ 2

Используйте . как pathspec вместо *.

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

Ответ 3

Я вижу много строк grepped из *.cmd файлов. Таким образом, кажется, что опция exclude не работает для меня.

Существует опция оболочки nullglob, которая управляет расширением шаблонов оболочки, когда нет соответствующего файла.


Итак, учитывая следующую среду:

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

В моей системе (где nullglob не задано), выполните следующую команду:

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

Расширяется ( "понимается" ) оболочкой как:

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

То есть, я буду рекурсивно (-r) искать строку skim, начиная с f.cmd, g.sh и sub, но исключая любой файл, соответствующий шаблону '*.cmd'.

Результат:

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

НО, если в вашей среде установлена ​​опция nullglob, та же команда расширяет:

grep ckim f.cmd g.sh sub -r

Обратите внимание на то, как исчезло целое число --exclude=.... Таким образом, результат:

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

Теперь, для объяснения. Когда оболочка встречает шаблон глобуса (например: содержащий * или ? или еще несколько специальных символов), он расширяет его с помощью соответствующих файлов. Но если нет соответствующих файлов, он либо позволяет шаблон как он (если nullglob не установлен), либо заменить его "ничего" (если установлен nullglob).

Здесь шаблон --include=*.cmd (в целом, так как там нет места). В маловероятном случае у вас есть файл, соответствующий этому шаблону, он был бы заменен. В противном случае это либо "как есть", либо полностью удалено - в зависимости от nullglob.


Вы можете легко отобразить, установить (-s) или отключить (-u) статус опции nullglob текущего bash:

sh$ shopt nullglob
nullglob        on

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

sh$ shopt -s nullglob
sh$ shopt nullglob
nullglob        on

Ответ 4

вы также можете сделать что-то вроде этого

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

Ответ 5

Если вы хотите исключить определенные файлы для grep, вам следует использовать опцию -l.

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