Как я могу использовать 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, который является комбинацией клавиш для конца -файл).

USTA
источник
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' *

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

Paxwell
источник
1
Не нужно указывать строку поиска без специальных символов, таких как пробелы
Скотт Стенсланд,
5
  1. grep -r "yourstring" * Найдет "yourstring" в любых файлах и папках

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

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

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

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

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

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

jfhfhf839
источник
4
grep -R "string" /directory/

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

DimiDak
источник
2

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

grep -nr yourString* .

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

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

grep -nr \w*yourString\w* .

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

eLRuLL
источник
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' * 
Iwantha
источник
0

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

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

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

yucer
источник
-4

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

AAAfarmclub
источник
2
Это, может быть, отличные инструменты, но это не ответит, как бы я использовал эти инструменты для выполнения того, что просит ОП.
Jmathew