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

вопрос создан в Sun, May 21, 2017 12:00 AM

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

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

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

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

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

    
4579
  1. помните, что grep будет интерпретировать любые . как односимвольный подстановочный знак, среди прочего. Мой совет: всегда используйте fgrep или egrep.
    2013-10-28 11: 54: 06Z
  2. в любом случае, вы были почти там! Просто замените -H на -l (и, возможно, grep на fgrep). Чтобы исключить файлы с определенными шаблонами имен, вы должны использовать find более сложным способом. Однако стоит научиться пользоваться find. Всего man find.
    2013-10-28 12: 01: 23Z
  3. find … -exec <cmd> + легче набрать и быстрее, чем find … -exec <cmd> \;. Это работает, только если <cmd> принимает любое количество аргументов имени файла. Экономия времени выполнения особенно велика, если запуск <cmd> происходит медленно, как в сценариях Python или Ruby.
    2016-01-28 05: 16: 24Z
  4. Чтобы выполнить нерекурсивный поиск по заданному пути, используйте команду `grep --include = *. txt -snw" pattern "thepath /*.
    2016-08-15 12: 34: 35Z
  5. @ StéphaneLaurent Я думаю, вы слишком усложняете это. Просто скажите grep "pattern" path/*.txt
    2016-12-02 13: 13: 16Z
30 ответов                              30                         

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

 
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.

    
8280
2018-01-04 03: 57: 06Z
  1. используйте --exclude. как "grep -rnw --exclude = *. o 'directory' -e" pattern "
    2013-06-06 08: 29: 44Z
  2. Я нахожу параметр grep --include очень полезным. Например: grep -rnw --include = *. Java. -е "все, что я ищу"
    2013-11-14 15: 43: 41Z
  3. на это стоит обратить внимание: кажется, что опция r ленива (проходит сначала в глубину, затем останавливается после первого каталога), а R является жадной (будет проходить по всему дереву правильно).
    2015-03-24 15: 09: 46Z
  4. Примечание (особенно для новичков): важны кавычки в приведенной выше команде.
    2015-12-22 12: 37: 38Z
  5. @ Eliran Malka R и r будут правильно проходить по обоим каталогам, но R будет следовать по символическим ссылкам.
    2016-07-05 08: 36: 40Z

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

 
grep -Ril "text-to-find-here" /
  •  i означает игнорировать регистр (опционально в вашем случае).
  •  R обозначает рекурсивный.
  •  l означает «показать имя файла, а не сам результат».
  •  / означает запуск с корня вашей машины.
1313
2016-02-23 10: 02: 31Z
  1. Исходя из моего опыта, -i сильно замедляет работу, поэтому не используйте его, если не нужно. Проверьте это в определенном каталоге, а затем обобщите. Это должно быть завершено в течение нескольких минут. Я думаю, что регулярное выражение сделало бы это медленнее. Но мои комментарии основаны на предположениях, я предлагаю вам проверить его с time перед строкой.
    2013-06-06 08: 14: 37Z
  2. Да, /* означает это. Во всяком случае, я только что проверил это и заметил, что только / работает.
    2013-06-06 08: 15: 21Z
  3. Если вы не используете регулярное выражение для поиска, вы можете использовать fgrep вместо grep в большинстве систем.
    2013-09-28 14: 49: 37Z
  4. Да @ markle976, фактически от man grep: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
    2013-09-30 08: 23: 43Z
  5. Вы можете заменить /на путь к каталогу grep -Ril "text-to-find-here" ~/sites/ или использовать. для текущего каталога grep -Ril "text-to-find-here" .
    2016-01-28 12: 19: 30Z

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

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

 
ack 'text-to-find-here'

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

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

UPDATE

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

    
287
2015-03-12 12: 31: 20Z
  1. Очень полезно, просто и быстро. Предупреждение: «В дистрибутивах, производных от Debian, ack упакован как« ack-grep », потому что« ack «уже существует» (из ). beyondgrep.com/install ). Вы можете запустить конвертер кода Кандзи на этих Linux-системах ...
    2013-09-20 13: 32: 27Z
  2. ack или ack-grep имеют хорошие моменты, но при правильном использовании find + grep намного лучше в производительности
    2015-02-11 09: 00: 16Z
  3. Обратите внимание, что ripgrep работает быстрее всего упомянутое здесь, в том числе Серебряный Искатель и Обычный Греп. См. этот пост в блоге для подтверждения.
    2017-10-14 04: 01: 00Z

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

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

    
163
2018-04-02 08: 35: 40Z
  1. Спасибо за версию для поиска. В моей версии grep (busybox для NAS) нет опции -r, мне действительно нужно другое решение!
    2016-09-02 10: 34: 12Z
  2. Спасибо за версию 'find'! Очень важно иметь возможность фильтровать по « .js» или « .txt» и т. Д. Никто не хочет тратить часы в ожидании, пока grep завершит поиск всех мультигигабайтных видео из последнего семейства отпуск, даже если команду легче набрать.
    2017-08-16 15: 10: 25Z

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

 
grep -inr "Text" folder/to/be/searched/
    
99
2013-07-31 14: 09: 59Z
  1. самый простой, подробный, рекурсивный и без учета регистра. палец вверх.
    2015-04-09 12: 44: 43Z
  2. если вы добавите -A3, то еще лучше
    2016-02-24 10: 43: 04Z

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

Прежде всего, я считаю, что вы использовали -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
2017-10-07 05: 54: 21Z
  1. Что и делает эта команда: find передаст все пути, которые она найдет, команде grep -l "text-to-find-here" <file found>". Вы можете добавить ограничения к имени файла, например, find / -iname "*.txt" для поиска только в файлах, имя которых заканчивается на .txt
    2017-04-20 13: 46: 45Z
  2. @ Вспомогательный - включен пример вывода, чтобы избежать путаницы для читателей.
    2017-10-07 05: 56: 16Z
  3. @ Mene Это действительно грустное состояние, что комментарий Вспомогательного имеет больше голосов, чем ваш ... даже если их комментарий от 2014 года, а ваш комментарий 2017 года, что их комментарий имеет 6, когда у него должно быть ровно 0, а у вас только один (сейчас два) - это не то, во что я бы хотел верить.
    2018-05-01 23: 01: 52Z
  4. @ Mene При этом -iname нечувствителен к регистру, что означает, что он также найдет, например, файлы .TXT, а также TxT и TXt и т. Д.
    2018-05-01 23: 04: 37Z

grep ( GNU или BSD )

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

 
grep -r "class foo" .

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

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

 
grep "class foo" **/*.c

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

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

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

Либо используйте ripgrep .

ripgrep

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

 
rg "class foo" .

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

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

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

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

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

55
2018-04-10 13: 55: 15Z
  1. Я также считаю полезным расширенное глобирование. Но имейте в виду, что если файлов действительно очень много, вы можете получить ошибку «Список аргументов слишком длинный». (Простые сбои также склонны к такого рода ошибкам).
    2017-11-30 06: 47: 02Z
  2. Для вдыхания всей файловой системы rg будет гораздо менее болезненным, чем почти любой другой инструмент.
    2019-04-23 06: 11: 54Z

Если ваш 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
2015-08-12 09: 19: 16Z
  1. Это эквивалентно grep 'text-to-find-here' без имени файла, если find ничего не находит. Это будет зависать и ждать ввода пользователя! Добавьте --no-run-if-empty в качестве опции к xargs.
    2016-01-28 05: 46: 33Z
  2. Эта комбинация find и xargs не работает должным образом, если имена файлов или каталогов содержат пробелы (символы, которые xargs интерпретирует как разделители). Используйте find … -exec grep … +. Если вы настаиваете на использовании find вместе с xargs, используйте -print0 и -0.
    2016-01-28 05: 50: 11Z
 
grep -insr "pattern" *
  •  i: игнорировать различия регистра в PATTERN и входных файлах.
  •  n: добавьте в каждую строку префикса номер строки на основе 1 во входном файле.
  •  s: не показывать сообщения об ошибках несуществующих или нечитаемых файлов.
  •  r: рекурсивно читать все файлы в каждом каталоге.
38
2016-03-08 07: 39: 14Z
  1. Можете ли вы объяснить, как ваш ответ улучшается по отношению к другим ответам или насколько он значительно отличается от них?
    2016-02-26 06: 10: 08Z
  2. не очень сложный для запоминания, он будет охватывать все шаблоны (case-senstivity -> gt; off, включает в себя имена файлов и номера строк и будет выполнять рекурсивный поиск и т. д.) и использование «*» в конце будет искать все каталоги (не нужно указывать путь или имя каталога).
    2016-02-26 06: 15: 40Z
  3. Извините, я должен был быть более понятным: было бы здорово, если бы вы включили это объяснение в свой ответ. В нынешнем виде, особенно с таким количеством похожих ответов, по такому короткому ответу трудно понять, какой будет польза от попытки it перед принятым или одним из проголосовавших.
    2016-02-26 06: 35: 01Z
  4. @ AmosM.Carpenter Одна вещь, которая мне нравится в этом ответе, это указание на аргумент подавления, который может помочь отфильтровать шум, который не имеет значения для получения результатов, на самом деле хочу. Grep печатает такие ошибки, как «Функция не реализована», «Недопустимый аргумент», «Ресурс недоступен» и т. Д. И т. Д. На некоторых «файлах».
    2017-02-20 05: 58: 27Z
  5. @ leetNightshade: я предполагаю, что вы обращаетесь ко мне со своим комментарием, потому что я попросил объяснения по поводу редкого исходного сообщения. Пожалуйста, ознакомьтесь с отличной редакцией Фабио, чтобы мои предыдущие комментарии имели смысл.
    2017-02-20 11: 59: 14Z
  

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

     

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

     

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

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

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

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

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

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

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

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

Серебряный поисковик :

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

ack :

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

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

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

    
30
2018-06-02 17: 21: 54Z
  1. 'find - это стандартный инструмент для поиска файлов, содержащих определенный текст на Unix-подобных платформах' , мне кажется довольно двусмысленным. Даже не считая рекурсивного grep, find напрямую не ищет внутри файлов текст. И, возможно, эти дополнительные инструменты полезны для некоторых, но старых таймеров и тех, кто, к примеру, хорошо привык. grep не дал бы им время вообще (ну, я, конечно, не буду). Не говоря, что они бесполезны.
    2018-05-01 23: 36: 48Z
  2. ".... содержащий конкретный текст ...": эта часть предложения была неточной (потому что не нашла себя, которая имеет дело с этой частью поиска ). Ред. Спасибо.
    2018-06-01 09: 21: 33Z
  3. Рад помочь! Единственное, что очень быстро бросается в глаза, это изменение слова folder на directory , но я знаю, что это мой крестовый поход, который я никогда не выиграю полностью. Не сдаваться, хотя ...
    2018-06-01 16: 13: 32Z
  4. Почему бы не "каталог" вместо "папка", но почему? Пожалуйста, поделитесь своим "крестовым походом"!
    2018-06-01 17: 00: 56Z
  5. Я говорю, вместо этого используйте каталог! Ссылаясь на: вам лучше заменить '/' на имя подпапки И это моя любимая мозоль .. esp, так как даже Windows назвала его «каталогом». Ах ... может быть, вы получили это. Зачем? Ну, потому что это так называется. Это также называется на уровне файловой системы. И посмотрите на это так: когда-нибудь это называлось (для DOS) fol ? Нет, конечно нет; он назывался dir (и я верю, что он до сих пор). Папка - вещь, придуманная (я полагаю) удобством для пользователя, хотя в этом случае она, возможно, притупляет ее для менее «продвинутых» пользователей?
    2018-06-02 00: 15: 19Z

Try:

 
find . -name "*.txt" | xargs grep -i "text_pattern"
    
27
2015-04-17 15: 33: 47Z
  1. Это на самом деле яркий пример того, когда НЕ использовать xargs, как это .. учтите это. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. xargs здесь соответствовал НЕПРАВИЛЬНОМУ файлу и НЕ соответствовал предполагаемому файлу. Или используйте find .. -print0 | xargs -0 ..., но это бесполезное использование трубы или лучше find ... -exec grep ... {} +
    2016-10-11 20: 10: 13Z

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

 
sudo apt install silversearcher-ag

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

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

 
ag -ia "Search query"

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

    
27
2017-05-25 00: 08: 18Z

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

 
grep -rnw `pwd` -e "pattern"

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

grep -rnw -e "pattern"

или

grep -rnw "pattern"

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

    
26
2017-02-02 12: 29: 21Z
  1. использование pwd вообще не является необходимым, поскольку это значение по умолчанию. grep -rnw "pattern" достаточно.
    2016-12-02 13: 17: 04Z
  2. и на самом деле grep -rnw и тому подобное - это то, что ответили три года назад, я не понимаю, как этот ответ добавляет ценность.
    2016-12-02 14: 03: 42Z
  3. Выбранный ответ не показывает шаблон по умолчанию, и 5 человек, по-видимому, сочли его полезным
    2016-12-14 08: 27: 11Z
  4. Что вы подразумеваете под "шаблоном по умолчанию"? Принятый ответ содержит grep -rnw '/path/to/somewhere/' -e "pattern", что у вас есть здесь. 5 голосов после 2,3 млн посещений - не так уж много.
    2016-12-14 08: 45: 01Z
  5. Я согласен :-) в исходном ответе мне не хватало варианта использования, при котором вам вообще не нужно указывать путь или искать в текущем каталоге рекурсивно, что не отражено в принятом ответе. Таким образом, это был хороший опыт изучения grep, чтобы копать немного глубже.
    2016-12-14 14: 05: 21Z

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

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

 
grep -RIl "" .

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

    
18
2017-05-25 00: 01: 43Z
  1. Я не понимаю, как это лучше, чем использовать простые ls или find (для рекурсивного)
    2016-12-02 13: 15: 42Z

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

 
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
2014-02-01 05: 47: 35Z
  1. что это добавляет к существующим ответам?
    2016-12-02 13: 14: 58Z
  2. @ fedorqui egrep эквивалентно grep -E, и это означает, что --extended-regexp вы можете найти здесь unix.stackexchange.com/a/17951/196072
    2018-07-25 11: 00: 42Z
 
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
2014-11-26 13: 12: 58Z

Try:

 
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
2015-05-09 09: 49: 54Z
  1. Возможно, детали различий в папках очевидны для многих ... но также очень полезны для новичков. +1
    2016-10-17 18: 07: 09Z
  2. что это добавляет к существующим ответам?
    2016-12-02 13: 16: 03Z
  3. Назовите это моим крестовым походом, но слово "каталог". Это не Windows (которая в любом случае использовала 'directory' - pre 9x). Пожалуйста, перестаньте говорить «папка». Что касается вашей последней команды, вам даже не нужен '/' только FYI.
    2018-05-01 23: 12: 12Z

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

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

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

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

 
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 ИЛИ *.dfm ИЛИ, указанные с помощью -o
  3.  -type f указывает, что вы ищете файлы
  4.  -print0 и --null на другой стороне | (труба) являются важными, передавая имя файла от find к grep, встроенному в xargs, что позволяет передавать имена файлов с пробелами в именах файлов, позволяя grep обрабатывать путь и имя файла в виде одной строки, а не разбивать его на каждый пробел.
14
2017-05-25 00: 03: 28Z
  1. -name '*.*' не то, что вы говорите; он не обнаружит файл с именем «file», потому что шаблон не соответствует этому (нет .ext); * однако (хорошо. Файлы в стороне). Но есть еще одна вещь: если вам нужны все файлы, зачем вообще указывать имя файла? Никаких других комментариев - за исключением того, что приятно знать, что все еще есть люди, которые не используют терминологию «папка» в терминологии MS (которую, на самом деле, после того, как я сказал это достаточно, я бы не стал добавлять, но я хотел бы отметить слегка неверное заявление, которое вы сделали с именами файлов - а также избыточностью /бесполезностью в случае 'all').
    2018-05-01 23: 25: 18Z

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

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

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

14
2017-05-25 00: 10: 37Z

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

 
alias ffind find / -type f | xargs grep

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

.  
ffind 'text-to-find-here'
    
14
2017-05-25 00: 15: 03Z

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

 
./sniff.py path pattern_to_search [file_pattern]

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

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

Например, если я хочу искать файлы Python с расширением py, содержащие Pool(, за которыми следует слово 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
2014-06-30 17: 59: 08Z

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

 
grep -c Your_Pattern *

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

    
12
2017-05-25 00: 13: 12Z

Чтобы найти строку и вывести только эту строку вместе со строкой поиска:

 
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
2014-01-25 11: 08: 41Z
  1. Я вижу только недостаток по сравнению с использованием find … -exec grep 'str' {} \; (если вам вообще нужно использовать find).
    2016-10-07 16: 14: 29Z
  2. Это ужасно сломалось бы, если бы любой из файлов, найденных find, содержал пробелы ... вы могли бы получить grepping неправильных файлов и /или пропустить нужные файлы в целом. Просто используйте find ... -exec grep ..., если вам нужно использовать find .. но в этом случае достаточно grep -r ....
    2016-10-11 20: 19: 36Z
  3. какой смысл использовать цикл над результатами поиска для поиска grep? Это становится излишне сложным.
    2016-12-02 13: 17: 45Z

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

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

ack -i search_string folder_path/*

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

    
11
2017-07-13 00: 17: 58Z
  1. Что это добавляет к существующим ответам? Это было предложено более трех лет назад.
    2016-12-02 13: 20: 15Z
  2. @ fedorqui 1) нет труб! 2) Используйте регулярные выражения. 3) Получите номера строк, имя файла с относительным путем, выделенный текст и т. Д., Полезные для редактирования после поиска, например, "vim + lineno path /file.cpp" доставит вас прямо к строке, которая вас не интересует. Смотрите вывод команды «ack include \| hpp», которая выполняет поиск по ключевым словам «include» или «hpp» в моей папке поиска и подпапках. Надеюсь, суть ясна. Вот пример выходных данных (Невозможно отобразить выделение ключевых слов простым текстом) process /child.hpp 11: boost /process /child.hpp process /all.hpp 21: #include < boost /process /executete.hpp &GT;
    2017-07-11 15: 57: 42Z

grep - ваш хороший друг для достижения этой цели.

 
grep -r <text_fo_find> <directory>

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

 
grep -ir <text_to_find> <directory>
    
11
2017-10-24 03: 07: 22Z
  1. В моем случае похоже, что он ищет везде, даже если я укажу каталог
    2018-03-20 16: 30: 36Z
  2. @ Pathros Вероятно, это связано с включенной рекурсией и указанным каталогом. Иными словами, рекурсия меняет положение вещей таким образом.
    2018-05-01 23: 38: 17Z
  3. @ Pathros О, и если в строке поиска есть - , которые вы хотите передать в -- чтобы начать сначала; в противном случае это может вызвать интересные побочные эффекты!
    2018-06-02 00: 25: 19Z

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

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

    
11
2019-04-24 15: 28: 42Z
  1. смотритель был бы в той же идее
    2017-07-12 20: 03: 37Z

Следующая команда отлично подойдет для этого подхода:

 
find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
    
10
2016-02-16 23: 47: 15Z
  1. какой смысл использовать find, а затем grep -r? Они предназначены для одного и того же, так что это избыточно.
    2015-12-23 17: 02: 39Z
  2. ооо! исправлено, на самом деле find для запуска grep на отфильтрованных файлах, и не все, спасибо
    2015-12-30 15: 25: 08Z
  3. тем не менее, это не имеет никакого смысла, вы можете фильтровать с find.
    2016-12-03 23: 00: 59Z

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

 
apt-get install ack-grep

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

 
cd /
ack-grep "find my keyword"
    
10
2016-03-23 ​​03: 41: 43Z

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

 
find . | xargs grep 'word' -sl
    
10
2017-05-25 00: 02: 19Z
  1. это намного медленнее, чем решение grep
    2014-12-22 16: 58: 35Z
  2. @amine Да, вместо того, чтобы использовать grep напрямую, он передает все найденные find файлы в xargs с grep . Я уверен, что вы понимаете это, но просто чтобы добавить к тем, кто не может. Команда здесь ... Я не могу придумать хорошую аналогию, но она добавляет много ненужных и безвредных накладных расходов.
    2018-06-02 01: 34: 08Z

Я восхищен тем, как просто 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
2017-09-04 06: 13: 54Z
  1. Это также работает в Git Bash (Windows).
    2019-04-24 15: 32: 18Z
  2. Но это подразумевает, что каждый файл должен быть найден (без фильтра по имени файла или уровню расширения файла, как .txt). Или есть способ сделать это?
    2019-04-24 16: 17: 02Z
источник размещен Вот
Другие вопросы