Что не так с командой «grep» в Ubuntu-18.04.6?

Что не так с командой «grep» в Ubuntu-18.04.6?

Я пользовался '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

Результат почти противоречит моему опыту несколько лет назад. Мои вопросы:

  1. Было ли много изменений в ubuntu-18.04.6 grep?
  2. Как указать шаблоны файлов в grep? Почему я не могу использовать шаблоны типа *.c, *.h *.c*как я делал это много лет назад?
  3. Мой коллега предложил мне использовать ack, но я нашел почти то же самое. Какие команды мне использовать для глобального поиска строк, как grepраньше?

решение1

Здесь есть две проблемы. Во-первых, вы не можете объединить флаги -ror -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.

Связанный контент