У меня есть набор .html файлов в каталоге. Я хочу просмотреть каждый файл и соответствовать шаблону (MD5). Все это достаточно легко. Проблема, я должен знать, в каком файле соответствие было найдено.
cat *.html | grep 75447A831E943724DD2DE9959E72EE31
Только возвращает содержание страницы HTML, где соответствие найдено, но оно не говорит мне файл, в котором это было найдено. Как я могу заставить grep показывать мне имя файла, где мое соответствие найдено?
grep -H 75447A831E943724DD2DE9959E72EE31 *.html
<час> -H, --with-filename
Print the file name for each match. This is
the default when there is more than one file
to search.
Я использую этого все время для поиска файлов, содержащих строку, РЕКУРСИВНО в каталоге (который означает, пересекая любой sub sub sub папка) grep -Ril "yoursearchtermhere"
R
должен искать рекурсивно (после символьных ссылок) i
, должен сделать его нечувствительным к регистру l
, должен только перечислить название файлов. настолько отвечающий на Ваш вопрос grep -l '75447A831E943724DD2DE9959E72EE31' *.html
сделает, но можно просто сделать grep -Ril '75447A831E943724DD2DE9959E72EE31'
для поиска той строки, нечувствительной к регистру, в любом файле в любой подпапке
Можно попробовать это
grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '
Альтернатива
grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html
Выполнение выше будет искать рекурсивно в папке и подпапках и печатать путь файла...
Ответ, отправленный Cyrus, является абсолютно надлежащим и является Правильным Путем <глоток> ТМ глоток>, чтобы сделать это с grep
если мы только потребность найти файлы . Когда для имен файлов нужно к дополнительный парсинг или операции на подобранных именах файлов, мы можем обратиться к использованию while
цикл с if
оператор. Вот пример, куда список имен файлов прибывает из очень наиболее часто используемого find
+ while
структура для безопасного парсинга имен файлов.
find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
if grep -q 'PATTERN' "$filename"
then
printf "%s found in %s\n" 'PATTERN' "$filename"
# Here we can insert another command or function
# to perform other operations on the filename
fi
done
Я бы сделал так:
find . -type f -name=*.html -exec grep -H 75447A831E943724DD2DE9959E72EE31 {} \;