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

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

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

12 ответов

Решение
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.

grep -nr string my_directory

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

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

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

grep -R "your word" .

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

grep -inR "your regex pattern" .

Есть также:

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

grep -nr search_string search_dir

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

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

grep -nr string

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

grep -nr string .

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

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

grep -r 'text' *

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

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

grep -wnr "yourString" .

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

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

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

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

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

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

  1. grep -rE "yourstring|yourotherstring|$" * будет искать список мест, где yourstring или же yourotherstring Матчи
grep -R "string" /directory/

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

grep --version
grep (GNU grep) 3.1

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

grep -nr yourString* .

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

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

grep -nr \w*yourString\w* .

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

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

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

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

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

grep -r 'your string goes here' * 

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

Другие вопросы по тегам