Я пользовался 'grep' десятилетиями, но спустя годы я оставил Linux и вернулся снова, обнаружив, что 'grep' работает иначе, чем раньше. Я проверил его использование в Интернете и подтвердил, что моя память не повреждена.
Я уверен, что некоторые *.h
и *.cpp
файлы находятся в более глубоких подкаталогах. Я использовал следующие команды и получил неожиданно похожее:
grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*
Я получил результат
grep: *.h: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c*: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris........svn-base
соответственно.
- Если бы я использовал команду:,
grep 44738 -r -l .
я получил бы тот же результат, за исключением первой строкиgrep: ...
- Если бы я использовал команду:,
grep 44738 -r -l *.c*
я бы просто осталсяgrep: ...
без каких-либо файлов. - Если бы я использовал команду:,
grep 44738 -r -l -file *.c* .
я бы просто получилgrep: *.c*: No such file or directory
Результат почти противоречит моему опыту несколько лет назад. Мои вопросы:
- Было ли много изменений в ubuntu-18.04.6
grep
? - Как указать шаблоны файлов в grep? Почему я не могу использовать шаблоны типа
*.c
,*.h
*.c*
как я делал это много лет назад? - Мой коллега предложил мне использовать
ack
, но я нашел почти то же самое. Какие команды мне использовать для глобального поиска строк, какgrep
раньше?
решение1
Здесь есть две проблемы. Во-первых, вы не можете объединить флаги -r
or -R
и также указать имена целевых файлов в качестве аргументов. -r
/ -R
включает рекурсивный поиск, что означает «поиск по всем файлам в указанных каталогах», поэтому они будут grep
рассматривать его аргумент как каталог для поиска файлов. Поскольку нет каталога, имя которого совпадает с глобальным *.c*
шаблоном, вы получаете ошибку, которую вы показываете. Насколько я помню, так было всегда, по крайней мере с тех пор, как я использую Linux, а это уже почти 25 лет.
Вы можете использовать подстановки по своему усмотрению, если не используете флаги -r
/ -R
,новы должны заключить их в кавычки, это важно. Если вы не заключите их в кавычки, как вы это сделали, глоб будет расширен оболочкой на все соответствующие файлы и grep
не увидит глоб, а только результат его расширения оболочкой, то есть только любые файлы или каталоги в текущем каталоге, имена которых совпадают с глобом.
GNU grep
, используемый по умолчанию в Linux, позволяет сделать то, что вам нужно, но синтаксис отличается:
grep 44738 -r -l --include='*.h'
Видеть man grep
:
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude). If contradictory
--include and --exclude options are given, the last matching
one wins. If no --include or --exclude options match, a file
is included unless the first such option is --include.