Как я могу использовать 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 {}").
grep -r "yourstring" *
Найдет "yourstring" в любых файлах и папках
Теперь, если вы хотите искать две разные строки одновременно, вы всегда можете использовать опцию E и добавить слова для поиска. пример после перерыва
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 с тоннами опций.