Почему команда find -regex отличается от команды find | Grep? - PullRequest
0 голосов
/ 18 апреля 2019

Команда find, расположенная ниже, ничего не выводит и не находит никаких "включаемых" файлов или каталогов.

find  -regex "*include*" 2>/dev/null 

Тем не менее, передача команды find в grep -E, похоже, находит большинство включаемых файлов.

find ./ 2>/dev/null | grep -E "*include*"

Я пропустил вывод, так как первый пустой, а второй соответствует довольно многим файлам.

Я начинаю копаться в системных файлах linux, чтобы найти ответы, которые мне нужны (особенно для поиска значений макросов).Для этого я использовал find |grep -E, чтобы найти файлы, которые должны иметь макрос, который я ищу.

Ниже приведена строка, которую я пытался найти с помощью find (мой корневой каталог - /), и ничего не выводится.Я не хочу запускать команду от имени пользователя root, поэтому я передаю ошибки в / dev / null.Я проверил ошибки на наличие синтаксических ошибок регулярных выражений, но ничего.Он все еще проходит по всем каталогам, так как я все еще получаю ошибку «find: / var / lib: Permission Denied»

find  -regex "*include*" 2>/dev/null 

Однако, похоже, это работает и дает мне все, что я хочу.

find ./ 2>/dev/null | grep -E "*include*"

Поэтому мой главный вопрос: почему find -regex не выдает то же самое, что find |grep -E?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Насколько я понимаю ваш вопрос, вы хотите найти файлы в каталогах Linux

Вы должны использовать эту библиотеку

yum install locate

Если вы используете Ubuntu

sudo apt-get install locate

Подготовить библиотеку

sudo updatedb

Тогда начните поиск

locate include 
0 голосов
/ 18 апреля 2019

Регулярные выражения - это не язык, а общая математическая конструкция с множеством различных обозначений и их диалектов.

Для простых шаблонов вы часто можете игнорировать этот факт, поскольку большинство диалектов используют очень похожие обозначения, нотак как вы задаете плохо определенный шаблон с ведущей звездочкой, вы попадаете в специфичное для движка поведение.

  • grep -E использует реализацию POSIX ERE в GNU и интерпретирует ваш шаблон как ()*includ(e)* и, следовательно, соответствует includ, за которым следует ноль или более e с.(POSIX говорит, что поведение ведущей звездочки не определено ).

  • find использует Emacs Regex и интерпретирует его как \*includ(e)* и поэтому требуетбуквальная звездочка в имени файла.

Если вы хотите получить одинаковые результаты для обоих, вы можете использовать find -regextype posix-egrep или указать регулярное выражение, эквивалентное в обоих, например .*include.*соответствовать include как подстроке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...