Как я могу использовать grep для поиска слова в папке?
в Windows я бы сделал поиск для поиска слова внутри папки. Аналогично, я хочу знать, встречается ли определенное слово внутри каталога, содержащего множество подкаталогов и файлов. Мои поиски синтаксиса grep показывают, что я должен указать имя файла, т. е. grep string filename
.
теперь, я не знаю имя, и что мне делать?
Друг предложил сделать grep -nr string
, но я не знаю, что это значит, и у меня нет результатов (нет ответа, пока я не выдам сочетания клавиш Ctrl + c).
11 ответов
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*.*'
другой способ сделать то же самое.)
для проверки дополнительных параметров используйте человек грэп.
grep -nr string my_directory
дополнительные примечания: это удовлетворяет синтаксису grep [options] string filename
потому что в Unix-подобных системах каталог является своего рода файлом (есть термин "обычный файл", чтобы конкретно ссылаться на объекты, которые называются просто "файлами" в Windows).
grep -nr string
читает содержимое для поиска из стандартного ввода, поэтому он просто ждет там ввода от вас и перестает делать это при нажатии ^C (он также остановится на ^D, что является комбинацией клавиш для конец файла.)
: Глобальное Регулярное Выражение Print/Parser/Processor/Program.
Это можно использовать для поиска в текущем каталоге.
Вы можете указать-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
и это захватывает его стандартный ввод кусками (чтобы избежать ограничений длины командной строки), используя нулевые символы в качестве разделителя записей (а не стандартной новой строки) и applies grep -li word
для каждого набора файлов. На grep
, -l
означает "список файлов, которые соответствуют" и -i
означает "без учета регистра"; вы обычно можете комбинировать параметры одного символа, чтобы вы видели -li
чаще, чем -l -i
.
если вы не используете -print0
и -0
затем вы столкнетесь с проблемами с именами файлов, которые содержат пробелы, поэтому их использование является хорошей привычкой.
grep -nr search_string search_dir
будет делать рекурсивный (то есть каталог и все его подкаталоги) поиск search_string. (как правильно ответил уста).
причина, по которой вы не получали anwers с предложением вашего друга:
grep -nr string
потому что каталог не был указан. Если вы находитесь в каталоге, в котором вы хотите выполнить поиск, вы должны сделать следующее:
grep -nr string .
важно включить '.- характер, как видно из этого. grep для поиска в этом каталоге.
-
grep -r "yourstring" *
Найдет "yourstring" в любых файлах и папках
теперь, если вы хотите искать две разные строки одновременно, вы всегда можете использовать опцию E и добавлять слова для поиска. пример после перерыва
-
grep -rE "yourstring|yourotherstring|$" *
будет искать список мест, гдеyourstring
илиyourotherstring
игр
еще один вариант, который мне нравится использовать:
find folder_name -type f -exec grep your_text {} \;
- тип f возвращает вам только файлы, а не папки
- exec и {} запускает grep для файлов, которые были найдены в поиске (точный синтаксис- " - exec command {}").
почему бы не выполнить рекурсивный поиск, чтобы найти все экземпляры в подкаталогах:
grep -r 'text' *
это работает как шарм.
ответ выбран хорошо, и это работает, но это не правильный способ сделать это, потому что:
grep -nr yourString* .
это фактически ищет строку "yourStrin"
и "g"
0 или много раз.
таким образом, правильный способ сделать это:
grep -nr \w*yourString\w* .
эта команда выполняет поиск строки с любым символом до и после в текущей папке.
Не используйте grep. Скачать Серебряный Искатель или ripgrep. Они оба выдающиеся и намного быстрее, чем grep или ack с множеством вариантов.
подобно ответу, опубликованному @eLRuLL, более простой способ указать поиск, который уважает границы слов, - использовать :
grep -wnr "yourString" .