Ответ 1
Вы можете процитировать шаблон:
grep -r --exclude="*.cmd" "ckin" ./
PS. ./
- текущий каталог
Я читал
Использовать grep --exclude/- включить синтаксис, чтобы не grep через определенные файлы
но в моем CentOS6.4, когда я делаю
grep --exclude=*.cmd ckim * -r
Я вижу много строк grepped из *.cmd файлов.
поэтому кажется, что вариант исключения не работает для меня.
Что не так?
конечно, я могу делать такие вещи, как
grep ckim \`find . -name \*.c -print\`
но я хочу знать, почему grep не работает.
Вы можете процитировать шаблон:
grep -r --exclude="*.cmd" "ckin" ./
PS. ./
- текущий каталог
Используйте .
как pathspec вместо *
.
grep -r --exclude \*.cmd ckim .
Я вижу много строк 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
вы также можете сделать что-то вроде этого
grep -rn ckim * | grep -v '\.cmd'
Если вы хотите исключить определенные файлы для grep, вам следует использовать опцию -l
.
grep -l --exclude=*.cmd ckim * -r