find/grep за изброяване на намерен конкретен файл, който съдържа конкретен низ

Имам главна директория, в която трябва да изпълня команда find и/или grep, за да върна списък с файлове, които съдържат конкретен низ.

Ето пример за настройка на файл и директория. В действителност тази основна директория съдържа много поддиректории, всяка от които има много поддиректории и файлове, но този пример, надявам се, разбира моята гледна точка.

въведете описание на изображението тук

От root трябва да мина през всяка от дъщерните директории, по-специално в subdir/ и да потърся file.html за низа "example:". Ако бъде намерен резултат, бих искал той да отпечата пълния път до file.html, като например website_two/subdir/file.html.

Реших, че ограничаването на търсенето до subdir/file.html ще увеличи значително скоростта на тази операция.

Не съм много запознат с командите find и grep, но опитах следното без успех, но честно казано не знам как да го отстраня.

find . -name "file.html" -exec grep -HI "example:" {} \;

РЕДАКТИРАНЕ: Разбирам, че това може да е маркирано като дубликат, но мисля, че въпросът ми е по-скоро за това как мога да кажа на командата да търси само конкретен файл по конкретен път, преминавайки през всички директории на ниво root->.


person Matt.    schedule 09.06.2017    source източник
comment
Разбирам, че това може да бъде маркирано като дубликат, но мисля, че въпросът ми е по-скоро в смисъла на това как мога да кажа на командата да търси само конкретен файл по конкретен път, преминавайки през всички директории на ниво › root.   -  person Matt.    schedule 09.06.2017
comment
може би защото няма съвпадение (-I означава нечувствителен към главни и малки букви), в противен случай замяната на крайния \; с + ще стартира по-малко процеси поради последния аргумент {}, който ще бъде заменен с толкова аргументи, които могат да се поберат в командния ред   -  person Nahuel Fouilleul    schedule 09.06.2017
comment
Написах рекурсивна bash (тествана също и с sh) функция, която преминава през дадено дърво на директории и greps файлове с дадено име за даден низ. Вижте тук. Можете да промените командата grep, за да отговаря на вашите нужди.   -  person James Brown    schedule 09.06.2017
comment
Какво не е наред с това find -exec grep, което имате? Наистина не виждам защо не работи.   -  person ilkkachu    schedule 10.06.2017


Отговори (1)


find ./ -type f -iname file.html -exec grep -l "example:" {} \+;

or

grep -Rl "example:" ./ | grep -iE "file.htm(l)*$" ще свърши работа.

Цитат от справочната страница на GNU Grep 2.25:

  -R, --dereference-recursive
         Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

  -l, --files-with-matches
         Suppress normal output; instead print the name of each input file from which output would normally have
         been printed.  The scanning will stop on the first match.

 -i, --ignore-case
         Ignore case distinctions in both the PATTERN and the input files.

 -E, --extended-regexp
         Interpret PATTERN as an extended regular expression.
person themeasure43    schedule 10.06.2017
comment
Това ще прочете всички файлове в дървото на директорията, въпреки че се интересуваме само от тези с известно име. Може да има и много други файлове. - person ilkkachu; 10.06.2017
comment
Решението grep | grep ще отпечата само файловете, които съответстват на file.htm(l)*$ модел. Става само с около 20% по-бавно от find. Редактирано, отговорено с find фрагмент - person themeasure43; 11.06.2017