Укажите имена файлов на основе шаблона имени файла и содержимого файла?
Как я могу использовать команду Grep для поиска file name
на основе wild card "LMN2011*"
, перечисляющего все файлы с этим как начало?
Я хочу добавить еще одну проверку этих файлов.
Если file content
имеет нечто вроде
LMN20113456
Могу ли я использовать GREP
для этого?
Grep -ls "LMN2011*" "LMN20113456"
Каким образом можно искать имена файлов и их содержимое с помощью команд оболочки?
Ответы
Ответ 1
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'
Ответ 2
Это можно сделать без find
, используя параметр grep "--include"
.
grep man говорит:
--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" ./
Или искать во всех файлах, начинающихся с "Сделать" в имени файла:
grep -r --include="Make*" "mytarget" ./
Ответ 3
grep LMN20113456 LMN2011*
или если вы хотите искать рекурсивно через подкаталоги:
find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \;
Ответ 4
find/folder -type f -mtime -90 | grep -E "(.txt |.php |.inc |.root |.gif)" | xargs ls -l > WWWlastActivity.log
Ответ 5
Предположим, что файлы LMN2011*
находятся внутри /home/me
, но пропускают что-либо в /home/me/temp
или ниже:
find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'