it-swarm.com.ru

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

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

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

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

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

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

4542
Nathan

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

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

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

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

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

8230
rakib_

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

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

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

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

ack 'text-to-find-here'

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

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


ОБНОВИТЬ

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

284
EarlOfEgo

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

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

162
learner_19

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

grep -inr "Text" folder/to/be/searched/
99
A R

Список имен файлов, содержащих данный текст

Прежде всего, я считаю, что вы использовали -H вместо -l. Также вы можете попробовать добавить текст в кавычки с последующим {} \.

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

Пример

Допустим, вы ищете файлы, содержащие определенный текст "Лицензия Apache" внутри вашего каталога. Он будет отображать результаты, несколько похожие на приведенные ниже (вывод будет отличаться в зависимости от содержимого вашего каталога).

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$ 

Удалить регистр чувствительности

Даже если вы не используете регистр, например "текст" или "текст", вы можете использовать переключатель -i, чтобы игнорировать регистр. Вы можете прочитать более подробную информацию здесь .

Надеюсь, это поможет вам.

60
lkamal

grep ( GNU или BSD )

Вы можете использовать инструмент grep для рекурсивного поиска в текущей папке, например:

grep -r "class foo" .

Примечание: -r - рекурсивный поиск в подкаталогах.

Вы также можете использовать синтаксис globbing для поиска в определенных файлах, таких как:

grep "class foo" **/*.c

Примечание. Используя опция globbing (**), он рекурсивно сканирует все файлы с определенным расширением или шаблоном. Чтобы включить этот синтаксис, выполните: shopt -s globstar . Вы также можете использовать **/*.* для всех файлов (исключая скрытые и без расширения) или любой другой шаблон.

Если вы ошиблись в том, что ваш аргумент слишком длинный, попробуйте сузить область поиска или используйте вместо этого синтаксис find, например:

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

В качестве альтернативы используйте ripgrep .

ripgrep

Если вы работаете с большими проектами или большими файлами, вы должны использовать вместо этого ripgrep, например:

rg "class foo" .

Ознакомьтесь с документами, инструкциями по установке или исходным кодом на страница проекта GitHub .

Это намного быстрее, чем любой другой инструмент, такой как GNU / BSDgrep , ucg , ag , sift , ack , pt или подобное, так как он построен поверх механизм регулярных выражений Rust который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым.

Он поддерживает шаблоны игнорирования, указанные в файлах .gitignore, поэтому один путь к файлу может быть сопоставлен с несколькими шаблонами glob одновременно.


Вы можете использовать общие параметры, такие как:

  • -i - нечувствительный поиск.
  • -I - игнорировать двоичные файлы.
  • -w - Поиск целых слов (в отличие от частичного совпадения слов).
  • -n - Показать строку вашего матча.
  • -C/--context (например, -C5) - увеличивает контекст, поэтому вы видите окружающий код.
  • --color=auto - Пометьте соответствующий текст.
  • -H - отображает имя файла, в котором находится текст.
  • -c - отображает количество совпадающих строк. Может сочетаться с -H.
54
kenorb

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

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

Я считаю, что это легче запомнить, чем формат для find -exec.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

извед:

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

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


Предупреждение : , если вы действительно не можете избежать этого, не ищите из '/' (корневой каталог) , чтобы избежать длительного и неэффективного поиска! Таким образом, в приведенных выше примерах лучше заменить "/" именем подкаталога, например, "/ home" в зависимости от того, где вы действительно хотите искать ...

30
Bludzee

Пытаться:

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

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

Sudo apt install silversearcher-ag

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

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

ag -ia "Search query"

И это сделает задачу за вас!

27
Neil Agarwal

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

grep -rnw `pwd` -e "pattern"

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

grep -rnw -e "pattern"

или же

grep -rnw "pattern"

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

26
mahatmanich

grep может использоваться, даже если мы не ищем строку.

Просто работает,

grep -RIl "" .

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

18
Alex Jasmin

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

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
16
Atul Arvind

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

alias ffind find / -type f | xargs grep

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

ffind 'text-to-find-here'
14
danglingpointer
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
14
Vinod Joshi

Надеюсь, это поможет ...

Слегка расширив grep, чтобы получить больше информации в выходных данных, например, чтобы получить номер строки в файле, где находится текст, можно сделать следующим образом:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

И если у вас есть представление о типе файла, вы можете сузить область поиска, указав для поиска расширения типов файлов, в данном случае .pas OR .dfm files:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Краткое объяснение вариантов:

  1. . в find указывает из текущего каталога.
  2. -name "*.*": для всех файлов (-name "*.pas" -o -name "*.dfm"): только файлы *.pas OR *.dfm, OR указано с -o
  3. -type f указывает, что вы ищете файлы
  4. -print0 и --null на другой стороне | (pipe) являются решающими, передавая имя файла из find в grep, встроенное в xargs, позволяя передавать имена файлов с пробелами в именах файлов, позволяя grep обрабатывать путь и имя файла в виде одной строки, а не разбивать его на каждый пробел.
14
Gert van Biljon

Silver Searcher - потрясающий инструмент, но ripgrep может быть даже лучше.

Он работает на Linux, Mac и Windows, и был написан на Hacker News пару месяцев назад (здесь есть ссылка на блог Эндрю Галланта, на котором есть ссылка на GitHub):

Ripgrep - новый инструмент поиска в командной строке

14
AAAfarmclub

Пытаться:

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

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

Для использования домашней папки:

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

Для текущей папки используйте:

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

Я написал скрипт Python , который делает что-то подобное. Вот как следует использовать этот скрипт.

./sniff.py path pattern_to_search [file_pattern]

Первый аргумент path - это каталог, в котором мы будем искать рекурсивно. Второй аргумент pattern_to_search - это регулярное выражение, которое мы хотим найти в файле. Мы используем формат регулярного выражения, определенный в библиотеке Pythonre. В этом сценарии . также соответствует символу новой строки.

Третий аргумент file_pattern является необязательным. Это еще одно регулярное выражение, которое работает с именем файла. Будут рассматриваться только те файлы, которые соответствуют этому регулярному выражению.

Например, если я хочу выполнить поиск файлов Python с расширением py, содержащим Pool(, за которым следует Word Adaptor, я сделаю следующее:

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

И вуаля, он генерирует путь сопоставленных файлов и номер строки, по которой совпадение было найдено. Если найдено более одного совпадения, то каждый номер строки будет добавлен к имени файла.

13
Dilawar

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

grep -c Your_Pattern *

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

12
Dr_Hope

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

grep -r <text_fo_find> <directory>

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

grep -ir <text_to_find> <directory>
11
Prash

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

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

11
Peter M.

Для поиска строки и вывода только этой строки вместе со строкой поиска:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

например.:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

Чтобы отобразить имя файла, содержащее строку поиска:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

например.:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
11
user3124504

Существует инструмент ack, который будет делать именно то, что вы ищете.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

Вы можете игнорировать -i для поиска с учетом регистра

11
Pal

Команда ниже будет хорошо работать для этого подхода:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
10
Pradeep Goswami

Попробуй это:

find . | xargs grep 'Word' -sl
10
Tayab Hussain

Я восхищен тем, как просто grep делает это с 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Используйте '-r' без 'l', чтобы увидеть имена файлов, за которыми следует текст, в котором найден шаблон!

grep -r 'pattern_to_find' /path/where/to/find

Работает просто отлично ..

Надеюсь, поможет!

10
nitinr708

Вы можете использовать приведенную ниже команду, так как вы не хотите, чтобы имя файла, но вы хотите искать из всех файлов. Здесь я записываю форму "ТЕКСТ". Все файлы журналов, чтобы убедиться, что имя файла не напечатано.

grep -e TEXT *.log | cut -d' ' --complement -s -f1

параметр grep с параметром -e довольно быстрый по сравнению с другим параметром, так как он соответствует параметру PATTERN.

10
Mitul Patel

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

apt-get install ack-grep

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

cd /
ack-grep "find my keyword"
10
Kareem

Если вы строго хотите использовать find, тогда:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

find + grep

1. Используйте find для поиска файлов, 2. Затем выполните grep для всех из них.

Может быть объединен в одну команду, как показано ниже:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

  • Используйте -name Pattern, если вы хотите grep только определенные файлы:

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

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

8
BreakBadSP

findс xargname__s предпочтительнее, когда есть много потенциальных совпадений, через которые можно просеять. Он работает медленнее, чем другие варианты, но всегда работает. Как обнаружили некоторые, xargsне обрабатывает файлы со встроенными пробелами по умолчанию. Вы можете преодолеть это, указав параметр -d.

Вот ответ @ RobEarl, улучшенный, поэтому он обрабатывает файлы с пробелами:

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

Вот ответ @ venkat, также улучшенный:

find . -name "*.txt" | xargs -d '\n' grep -i "text_pattern"

Вот ответ @Gert van Biljon, также улучшенный:

find . -type f -name "*.*" -print0 | xargs -d '\n' --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

Вот ответ @ LetalProgrammer, также улучшенный:

alias ffind find / -type f | xargs -d '\n' grep

Вот ответ @Tayab Hussain, также улучшенный:

find . | xargs -d '\n' grep 'Word' -sl
7
Mike Slinn

Если у вас есть набор файлов, которые вы всегда будете проверять, вы можете указать их пути, например:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

Затем вы можете просто отфильтровать список следующим образом:

grep -U -l $'\015' $(fd)

Который отфильтровывает список fd для файлов, которые содержат шаблон CR.

Я обнаружил, что совмещение имен интересующих меня файлов помогает мне создавать более простые сценарии, чем всегда пытаться вспомнить, как получить все эти файлы. Рекурсивный материал также работает, но рано или поздно вам придется бороться с отсеиванием определенных типов файлов. Вот почему я просто нахожу для начала все типы файлов, которые меня интересуют.

7
dkinzer

Попробуй это:

find / -type f -name "*" -exec grep -il "String_to_search" {} \;

Или же

for i in /*;do grep -Ril "String_to_search" $i;done 2> /dev/null
7
VIPIN KUMAR

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

grep -Erni + "text you wanna search"

Команда будет рекурсивно искать во всех файлах и каталогах текущего каталога и печатать результат.

Примечание: если ваш вывод grep не окрашен, вы можете изменить его, используя псевдоним grep = 'grep --color = always' в вашем исходном файле Shell.

7
baldash

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

cat file | grep 'abc' | cut -d':' -f2
7
iamjayp

Как Питер в предыдущем ответе упоминал , все предыдущие ответы предлагают grep и find.

Но есть более изощренный способ использования Gnome Commander с идеальным GUI и множеством опций с 2001 года, и поиск файлов - только один из них. Это также бесплатная утилита, проверенная временем.

7
Geeocode

Попробуй это

find . -type f -name some_file_name.xml -exec grep -H PUT_YOUR_STRING_HERE {} \;
6
Sireesh Yarlagadda

Смотрите также The Platinum Searcher , что аналогично The Silver Searcher и написано на Go.

Пример:

pt -e 'text to search'
5
Gustavo Paulo

Альтернатива поиска в графическом интерфейсе - для настольных ПК:

- Так как вопрос не в том, чтобы задавать команды

Searchmonkey : инструмент расширенного поиска файлов без необходимости индексировать вашу систему с помощью регулярных выражений. Графический эквивалент для поиска/grep. Доступно для Linux (Gnome/KDE/Java) и Windows (Java) - GPL с открытым исходным кодом, версия 3

Особенности:

  • Расширенные регулярные выражения
  • Результаты показаны в контексте
  • Поиск, содержащий текст
  • Панель для отображения строки, содержащей текст
  • Новые обновления 2018 года
  • и т.п.

Скачать - Ссылки:

,.

Экран выстрел:

Enter image description here

5
intika

ваша команда верна. Просто нужно добавить -l в grep.

find / -type f -exec grep -l 'text-to-find-here' {} \;
0
FariZ