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


Answers

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

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

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

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

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

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

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







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

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path



grep - ваш хороший друг, чтобы достичь этого.

grep -r <text_fo_find> <directory>

если вам не нужен случай поиска текста, то используйте

grep -ir <text_to_find> <directory>



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

Я наткнулся на это решение дважды:

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

Если вы используете find в вашем примере, лучше добавьте -s ( --no-messages ) в grep и 2>/dev/null в конце команды, чтобы избежать много сообщений о grep выданных grep и find :

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

find - стандартный инструмент для поиска файлов, содержащих определенный текст на Unix-подобных платформах; кстати, он часто сочетается с xargs .

Для этой же цели существуют более быстрые и простые инструменты - см. Ниже. Лучше попробуйте их, если они доступны на вашей платформе , конечно.

Более быстрые и простые альтернативы

ripgrep - быстрый инструмент поиска:

rg 'text-to-find-here' / -l

Серебряный Искатель :

ag 'text-to-find-here' / -l

ack :

ack 'text-to-find-here' / -l

Примечание. Вы также можете добавить 2>/dev/null к этим командам, чтобы скрыть много сообщений об ошибках.




Использование:

grep -c Your_Pattern *

Это сообщит, сколько копий вашего шаблона присутствует в каждом из файлов в текущем каталоге.




Появилась новая утилита под названием The Silversearcher

sudo apt install silversearcher-ag

Он тесно работает с Git и другими VCS. Таким образом, вы не получите ничего в .git или другом каталоге.

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

ag -ia "Search query"

И он выполнит эту задачу для вас!




Если ваш grep не поддерживает рекурсивный поиск, вы можете комбинировать find с xargs :

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

Мне это легче запомнить, чем формат find -exec .

Это приведет к отображению имени файла и содержимого соответствующей строки, например

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

Дополнительные флаги, которые вы можете добавить в grep :

  • -i case -чувствительный поиск
  • -l - выводить только имя файла, в котором было найдено совпадение
  • -h - выводить только строку, которая соответствует (а не имя файла)



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

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




Все предыдущие ответы предлагают grep и find. Но есть и другой способ: использовать полуночного командира

Это бесплатная утилита (30 лет, проверенная временем), которая визуальна, не являясь графическим интерфейсом. Имеет множество функций, поиск файлов - лишь один из них.




Простая find может работать удобно. псевдоним в файле ~/.bashrc :

alias ffind find / -type f | xargs grep

Запустите новый терминал и выполните выпуск:

ffind 'text-to-find-here'



find /path -type f -exec grep -l "string" {} \;

Объяснение из комментариев

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

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename



Используйте pwd для поиска из любого каталога, в котором вы находитесь, рекурсивный вниз

grep -rnw `pwd` -e "pattern"

Обновление. В зависимости от используемой вами версии grep вы можете опустить pwd . О новых версиях . представляется по умолчанию для grep, если каталог не указан таким образом:

grep -rnw -e "pattern"

или

grep -rnw "pattern"

будет делать то же, что и выше!




Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.

apt-get install ack-grep

Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже

cd /
ack-grep "find my keyword"



grep -insr "pattern" *
  • i : Игнорировать различия в случаях как в PATTERN, так и в входных файлах.
  • n : Префикс каждой строки вывода с номером строки 1 в его входном файле.
  • s : Подавлять сообщения об ошибках о несуществующих или нечитаемых файлах.
  • r : Прочитайте все файлы в каждом каталоге, рекурсивно.



Related