Как найти все файлы,содержащие определенный текст на Linux

linux text grep directory find


Я пытаюсь найти способ просканировать всю систему Linux на наличие всех файлов,содержащих определенную строку текста.Просто чтобы прояснить,я ищу текст внутри файла,а не в имени файла.

Когда я смотрел,как это сделать,я дважды наткнулся на это решение:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Однако,это не работает.Кажется,что он отображает каждый файл в системе.

Это близко к правильному пути? Если нет,то как? Такая возможность найти текстовые строки в файлах была бы чрезвычайно полезна для некоторых проектов по программированию,которые я выполняю.




Answer 1 rakib_


Сделайте следующее:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r или -R является рекурсивным,
  • -n это номер строки, и
  • -w означает совпадение всего слова.
  • -l Можно добавить -l ( строчная буква L), чтобы просто дать имя файла совпадающих файлов.

Наряду с этим, для эффективного поиска могут использоваться флаги --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 . Например, это исключит dirs dir1 /, dir2 / и все они будут соответствовать * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Это очень хорошо работает для меня,чтобы достичь почти той же цели,что и ваша.

Для дополнительных опций проверьте man grep .




Answer 2 fedorqui 'SO stop harming'


Вы можете использовать grep -ilR :

grep -Ril "text-to-find-here" /
  • i выступает за игнорирование дела (необязательно в вашем случае).
  • R обозначает рекурсивный.
  • l означает «показать имя файла, а не сам результат».
  • / означает запуск с корня вашей машины.



Answer 3 Stephan


Вы можете использовать ACK . Это как grep для исходного кода. Вы можете сканировать всю файловую систему с ним.

Просто сделай:

ack 'text-to-find-here'

В вашем корневом каталоге.

Вы также можете использовать регулярные выражения , указать тип файла и т. Д.


UPDATE

Я только что обнаружил Silver Searcher , который похож на ack, но в 3-5 раз быстрее его и даже игнорирует шаблоны из файла .gitignore .




Answer 4 learner_19


Ты можешь использовать:

grep -r "string to be searched"  /path/to/dir

Значение r означает рекурсивный и будет искать по указанному пути, а также по его подкаталогам. Это скажет вам имя файла, а также распечатает строку в файле, где появляется строка.

Или команда,аналогичная той,что вы пытаетесь (пример:)искать во всех файлах javascript (*.js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

При этом будут печататься строки в файлах,в которых появляется текст,но не будет печататься имя файла.

В дополнение к этой команде мы также можем написать это: grep -rn "String to search" / path / to / directory / или / file -r: рекурсивный поиск n: номер строки будет показан для совпадений




Answer 5 A R


Ты можешь использовать это:

grep -inr "Text" folder/to/be/searched/