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


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

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

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

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

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


3556


источник


Ответы:


Выполните следующие действия:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -rили -Rявляется рекурсивным,
  • -nномер строки и
  • -wозначает совпадение всего слова.
  • -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параметр. Например, это исключает dir1 /, dir2 / dir2 и все из них, соответствующие * .dst /:

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

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

Для проверки дополнительных параметров man grep,


6416



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

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

1042



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

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

ack 'text-to-find-here'

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

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


ОБНОВИТЬ

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


223



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

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" / путь / в / каталог / или / файл -r: рекурсивный поиск n: номер строки будет показан для совпадений


116



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

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

78



If your grep doesn't support recursive search, you can combine find with xargs:

find / -type f | xargs grep 'text-to-find-here'

I find this easier to remember than the format for find -exec.

This will output the filename and the content of the matched line, e.g.

/home/rob/file:text-to-find-here

Optional flags you may want to add to grep:

  • -i - case insensitive search
  • -l - only output the filename where the match was found
  • -h - only output the line which matched (not the filename)

43



List of file names containing a given text

First of all, I believe you have used -H instead of -l. Also you can try adding the text inside quotes followed by {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Example

Let's say you are searching for files containing specific text "Apache License" inside your directory. It will display results somewhat similar to below (output will be different based on your directory content).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Remove case sensitiveness

Even if you are not use about the case like "text" vs "TEXT", you can use the -i switch to ignore case. You can read further details here.

Hope this helps you.


42



grep -insr "pattern" *
  • i: Ignore case distinctions in both the PATTERN and the input files.
  • n: Prefix each line of output with the 1-based line number within its input file.
  • s: Suppress error messages about nonexistent or unreadable files.
  • r: Read all files under each directory, recursively.

32



grep (GNU or BSD)

You can use grep tool to search recursively the current folder, like:

grep -r "class foo" .

Note: -r - Recursively search subdirectories.

You can also use globbing syntax to search within specific files such as:

grep "class foo" **/*.c

Note: By using globbing option (**), it scans all the files recursively with specific extension or pattern. To enable this syntax, run: shopt -s globstar. You may also use **/*.* for all files (excluding hidden and without extension) or any other pattern.

If you've the error that your argument is too long, consider narrowing down your search, or use find syntax instead such as:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Alternatively use ripgrep.

ripgrep

If you're working on larger projects or big files, you should use ripgrep instead, like:

rg "class foo" .

Checkout the docs, installation steps or source code on the GitHub project page.

It's much quicker than any other tool like GNU/BSD grep, ucg, ag, sift, ack, pt or similar, since it is built on top of Rust's regex engine which uses finite automata, SIMD and aggressive literal optimizations to make searching very fast.

It supports ignore patterns specified in .gitignore files, so a single file path can be matched against multiple glob patterns simultaneously.


You can use the common parameters such as:

  • -i - Insensitive searching.
  • -I - Ignore the binary files.
  • -w - Search for the whole words (in opposite of partial word matching).
  • -n - Show the line of your match.
  • -C/--context (e.g. -C5) - Increases context, so you see the surrounding code .
  • --color=auto - Mark up the matching text.
  • -H - Displays filename where the text is found.
  • -c - Displays count of matching lines. Can be combined with -H.

26



Try:

find . -name "*.txt" | xargs grep -i "text_pattern"

23



Use pwd to search from any directory you are in, recursing downward

grep -rnw `pwd` -e "pattern"

Update Depending on the version of grep you are using, you can omit pwd. On newer versions . seems to be the default case for grep if no directory is given thus:

grep -rnw -e "pattern"

or

grep -rnw "pattern"

will do the same thing as above!


20



There's a new utility called The Silversearcher

sudo apt install silversearcher-ag

It works closely with Git and other VCS. So you won't get anything in a .git or another directory.

You can simply use

ag -ia "Search query"

And it will do the task for you!


20