it-swarm.com.ru

Список имен файлов на основе шаблона имени файла и содержимого файла?

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

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

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

LMN20113456

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

Grep -ls "LMN2011*"   "LMN20113456"

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

34
zod

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'
55
jm666

Это можно сделать и без 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" ./
24
Jahanzeb Farooq
grep LMN20113456 LMN2011*

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

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \;
7
Aoife

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

0
ugnelakys

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

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'
0
ohho