Список имен файлов на основе шаблона имени файла и содержимого файла? - PullRequest
37 голосов
/ 06 мая 2011

Как я могу использовать команду Grep для поиска file name на основе подстановочного знака "LMN2011*", перечисляющего все файлы с этим как начало?

Я хочу добавить еще одну проверку содержимого этого файла.

Если file content имеет что-то вроде

LMN20113456

Могу ли я использовать GREP для этого?

Grep -ls "LMN2011*"   "LMN20113456"

Как правильно искать имена файлов и их содержимое с помощью команд оболочки?

Ответы [ 5 ]

60 голосов
/ 06 мая 2011

Grep НЕ использует «подстановочные знаки» для поиска - это ракушка оболочки, как * .jpg. Grep использует "регулярные выражения" для сопоставления с образцом. В то время как в оболочке '*' означает «что угодно», в grep это означает «соответствовать предыдущему элементу ноль или более раз».

Больше информации и примеров здесь: http://www.regular -expressions.info / reference.html

Чтобы ответить на ваш вопрос - вы можете найти файлы, соответствующие некоторому шаблону, с помощью grep:

find /somedir -type f -print | grep 'LMN2011' # that will show files whose names contain LMN2011

Затем вы можете искать их содержимое (без учета регистра):

find /somedir -type f -print | grep -i 'LMN2011' | xargs grep -i 'LMN20113456'

Если пути могут содержать пробелы, вы должны использовать функцию «нулевого конца»:

find /somedir -type f -print0 | grep -iz 'LMN2011' | xargs -0 grep -i 'LMN20113456'
26 голосов
/ 03 апреля 2013

Это можно сделать и без find, используя опцию grep "--include".

Страница руководства grep гласит:

--include=GLOB
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).

Таким образом, чтобы выполнить рекурсивный поиск строки в файле, соответствующей определенному шаблону, он будет выглядеть примерно так:

grep -r --include=<pattern> <string> <directory>

Например, для рекурсивного поиска строки «mytarget» во всех файлах Makefile:

grep -r --include="Makefile" "mytarget" ./

Или для поиска во всех файлах, начинающихся с «Make» в имени файла:

grep -r --include="Make*" "mytarget" ./
7 голосов
/ 06 мая 2011
grep LMN20113456 LMN2011*

или если вы хотите выполнить рекурсивный поиск по подкаталогам:

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \;
0 голосов
/ 02 сентября 2016

Предположим, LMN2011* файлы находятся внутри /home/me, но пропускают что-либо в /home/me/temp или ниже:

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'
0 голосов
/ 15 января 2013

find / folder -type f -mtime -90 |grep -E "(.txt | .php | .inc | .root | .gif)" |xargs ls -l> WWWlastActivity.log

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