[Resolved] Как мне найти все файлы, содержащие определенный текст в Linux?
Вопрос:
Я пытаюсь найти способ просканировать всю мою систему Linux на предмет всех файлов, содержащих определенную строку текста. Чтобы уточнить, я ищу текст внутри файла, а не в имени файла.
Когда я искал, как это сделать, я дважды наткнулся на это решение:
find / -type f -exec grep -H "text-to-find-here' {} ;
Однако это не работает. Кажется, отображает каждый файл в системе.
Это близко к правильному способу сделать это? Если нет, то как мне? Эта способность находить текстовые строки в файлах была бы чрезвычайно полезна для некоторых программных проектов, над которыми я работаю.
Отвечать:
Способ # 1
Сделайте следующее:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
или-R
рекурсивно,-n
номер строки, а-w
означает соответствие всему слову.-l
(L в нижнем регистре) можно добавить, чтобы просто указать имя файла для совпадающих файлов.-e
шаблон, используемый во время поиска
Наряду с этим, --exclude
, --include
, --exclude-dir
флаги могут использоваться для эффективного поиска:
- Это будет искать только те файлы, которые имеют расширения .c или .h:
grep --include=*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
- Это исключит поиск всех файлов с расширением .o:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
- Для каталогов можно исключить один или несколько каталогов, используя
--exclude-dir
параметр. Например, это исключит каталоги dir1 /, dir2 / и все они, соответствующие * .dst /:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
Это очень хорошо работает для меня, достигая почти той же цели, что и ваша.
Для получения дополнительных опций проверьте man grep
.
Способ # 2
Вы можете использовать grep -ilR
:
grep -Ril "text-to-find-here" /
i
означает игнорировать регистр (в вашем случае необязательно).R
означает рекурсивный.l
означает «показывать имя файла, а не сам результат»./
означает запуск из корневого каталога вашей машины.
Способ # 3
Вы можете использовать ack
. Это похоже на grep
для исходного кода. С его помощью вы можете сканировать всю файловую систему.
ack 'text-to-find-here'