Как я могу использовать grep, чтобы найти слово в папке? - PullRequest
469 голосов
/ 08 ноября 2010

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

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

Ответы [ 12 ]

720 голосов
/ 17 декабря 2012
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 .

107 голосов
/ 08 ноября 2010

grep -nr string my_directory

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

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

55 голосов
/ 08 ноября 2010

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

grep -R "your word" .

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

grep -inR "your regex pattern" .
24 голосов
/ 08 ноября 2010

Также есть:

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

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

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

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

23 голосов
/ 08 ноября 2010
grep -nr search_string search_dir

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

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

grep -nr string

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

grep -nr string .

Важно включить '.'символ, поскольку это говорит grep искать в ЭТОМ каталоге.

4 голосов
/ 25 ноября 2015
  1. grep -r "yourstring" * Найдет "yourstring" в любых файлах и папках

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

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

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

grep -r 'text' *

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

3 голосов
/ 03 июня 2013

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

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

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

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

1 голос
/ 30 января 2019
grep -R "string" /directory/

Раньше это был grep -r, но я только заметил, что он больше не работает в моей версии.

grep --version
grep (GNU grep) 3.1
1 голос
/ 10 мая 2013

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

grep -nr yourString* .

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

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

grep -nr \w*yourString\w* .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...