Как я могу использовать grep, чтобы найти слово в папке?


542

В Windows я бы сделал поиск для поиска слова внутри папки. Точно так же я хочу знать, встречается ли определенное слово в каталоге, содержащем много подкаталогов и файлов. Мои поиски для Grep синтаксиса показывает , я должен указать имя файла, то есть grep string filename.

Теперь я не знаю имя файла, так что мне делать? Друг предложил сделать grep -nr string, но я не знаю, что это значит, и я не получил никаких результатов (ответа пока нет ctrl + c).

Ответы:


849
grep -nr 'yourString*' .

Точка в конце ищет текущий каталог. Значение для каждого параметра:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Найти MobileAppServlet.javaили MobileAppServlet.classили MobileAppServlet.txt; 'MobileAppASer*.*'это другой способ сделать то же самое.)

Чтобы проверить больше параметров, используйте команду man grep .


14
С чем дело *? Это приведет либо к расширению подстановочного знака оболочки (если есть имена файлов, соответствующие шаблону подстановки), либо grep примет его как оператор повторения 0 или более для предшествующего символа *.
Уста

7
Теперь давайте рассмотрим обе возможности grep -nr MobileAppSer* .1. Предположим , у нас есть 3 файлов в текущем каталоге соответствия MobileAppSer*шаблону: по имени MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Тогда grepбудет вызван следующим образом: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Это означает поиск текста «MobileAppServlet.class» в файлах MobileAppServlet.java, MobileAppServlet.txt и в других местах в текущем каталоге - что, безусловно, не то, что пользователь хочет здесь.
Уста

7
2. Если в текущем каталоге нет файлов, соответствующих MobileAppSer*шаблону с подстановочными знаками, grepон получит аргумент « MobileAppSer*как есть» и, таким образом, примет его как поиск текста «MobileAppSe», за которым последует 0 или более вхождений «r», поэтому он будет попытаться найти тексты «MobileAppSe», «MobileAppSer», «MobileAppSerr», «MobileAppSerrr» и т. д. в содержимом файлов текущего каталога - не то, что хочет пользователь.
Уста

5
Это сомнительный выбор регулярных выражений. Уста указал на это.
добрый день

117
grep -nr string my_directory

Дополнительные примечания: это удовлетворяет синтаксису, grep [options] string filenameпотому что в Unix-подобных системах каталог является своего рода файлом (существует термин «обычный файл», который специально относится к сущностям, которые в Windows называются просто «файлами»).

grep -nr string читает содержимое для поиска из стандартного ввода, поэтому он просто ждет ввода от вас и перестает делать это, когда вы нажимаете ^ C (это также останавливается на ^ D, который является комбинацией клавиш для конца -файл).


1
Эй, так что, если я хочу найти строку независимо от регистра, я должен сделать это: grep -i -nr "мое слово".
Кики

2
@kiki: Да, что эквивалентноgrep -inr "my word" .
usta

16
@kiki: -rfor grep означает рекурсивный поиск в подкаталогах и -nозначает префикс каждой строки вывода с соответствующим номером строки файла, который содержит эту строку. man grepописывает все это и многое другое.
Уста

62

GREP : Глобальный Регулярный Выражение Печать / Парсер / Процессор / Программа.
Вы можете использовать это для поиска в текущем каталоге.
Вы можете указать -R для «рекурсивный», что означает, что программа выполняет поиск во всех подпапках, их подпапках, подпапках их подпапок и т. Д.

grep -R "your word" .

-nнапечатает номер строки, где он соответствует в файле.
-iбудет искать без учета регистра (заглавные / не заглавные буквы).

grep -inR "your regex pattern" .

3
./* означает все файлы в текущем каталоге, -R означает рекурсивный (поиск в подкаталогах и т. д.)
Stefan Steiger

25
grep -nr search_string search_dir

выполнит RECURSIVE (имеется в виду каталог и все его подкаталоги) поиск строки поиска. (как правильно ответил уста).

Причина, по которой вы не получили никаких возражений с предложением вашего друга:

grep -nr string

потому что каталог не был указан. Если вы находитесь в каталоге, в котором вы хотите выполнить поиск, вы должны сделать следующее:

grep -nr string .

Важно включить «.» символ, как это говорит grep искать в этом каталоге.


Привет, что мне делать, если мне нужно искать 2 слова с пробелом между ними? Должны ли слова быть указаны в кавычках? т.е. grep -nr "мое слово".
Кики

24

Есть также:

find directory_name -type f -print0 | xargs -0 grep -li word

но это может быть немного много для новичка.

findявляется каталогом общего назначения walker / lister, -type fозначает «искать простые файлы, а не каталоги и именованные каналы и что у вас есть», -print0означает «выводить их на стандартный вывод, используя нулевые символы в качестве разделителей». Выходные данные от findотправляются xargs -0и получают его стандартный ввод кусками (чтобы избежать ограничений длины командной строки), используя нулевые символы в качестве разделителя записей (а не стандартный перевод строки), и применяются grep -li wordк каждому набору файлов. На grep, -lозначает «список файлов, которые соответствуют» и -iозначает «без учета регистра»; обычно вы можете комбинировать параметры одного символа, чтобы вы видели -liчаще -l -i.

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


1
@mmmshuddup: Спасибо. Мне плохо, если я не даю объяснения как часть ответа, особенно при работе с новичком.
мю слишком коротко

1
Это то, что я больше всего ценю на этом сайте. Важно помнить, что когда-то мы все были новичками, и в мире технологий это не так просто!
Да, Барри,

я могу исключить определенные каталоги? @muistooshort
Ferologics

@Ferologics Там должно быть, проверьте man findиз командной строки, чтобы увидеть, какие опции вы findподдерживаете.
мю слишком коротка

8

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

grep -r 'text' *

Это работает как шарм.


1
Не нужно указывать строку поиска без специальных символов, таких как пробелы
Скотт Стенсланд,

5
  1. grep -r "yourstring" * Найдет "yourstring" в любых файлах и папках

Теперь, если вы хотите искать две разные строки одновременно, вы всегда можете использовать опцию E и добавить слова для поиска. пример после перерыва

  1. grep -rE "yourstring|yourotherstring|$" *будет искать список мест, где yourstringили yourotherstringсовпадает

4

Еще один вариант, который мне нравится использовать:

find folder_name -type f -exec grep your_text  {} \;

-type f возвращает вам только файлы, а не папки

-exec и {} запускает grep для файлов, которые были найдены в поиске (точный синтаксис "-exec command {}").


4
grep -R "string" /directory/

-R следует также по символическим ссылкам, когда -r нет.


2

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

grep -nr yourString* .

Это фактически ищет строку "yourStrin"и "g"0 или много раз.

Таким образом, правильный способ сделать это:

grep -nr \w*yourString\w* .

Эта команда ищет строку с любым символом до и после в текущей папке.


2
однако grep -nr yourStringработает тоже, так как он ищет пустое место в yourStringлюбом месте строки (или, по крайней мере, в моей системе, OSX Lion)
theheadofabroom

1

Подобно ответу, опубликованному @eLRuLL, более простой способ задать поиск, который учитывает границы слов, состоит в использовании -wопции:

grep -wnr "yourString" .

В командной строке cmd или терминале windows термин grep не распознается
kouty

@kouty grep - это команда Unix. itechtics.com/using-findstr-windows
Уго М. Зулета

1

Запустите (терминал) следующую команду внутри каталога. Он также будет рекурсивно проверять внутри подкаталогов.

grep -r 'your string goes here' * 

0

Следующие образцы выглядит рекурсивно для your search stringв *.xmlи *.jsфайлы , расположенные где - то внутри папки path1, path2и path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

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


-4

Не используйте grep. Загрузите Silver Searcher или ripgrep . Они оба выдающиеся, и намного быстрее, чем grep или ack с тоннами опций.


2
Это, может быть, отличные инструменты, но это не ответит, как бы я использовал эти инструменты для выполнения того, что просит ОП.
Jmathew
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.