Как я могу использовать grep для поиска слова внутри папки?
В Windows я бы выполнил поиск для поиска слова внутри папки. Аналогично, я хочу знать, происходит ли конкретное слово внутри каталога, содержащего множество подкаталогов и файлов. Мои поиски синтаксиса grep показывают, что я должен указать имя файла, т.е. grep string filename
.
Теперь я не знаю имя файла, так что мне делать?
Друг предложил сделать grep -nr string
, но я не знаю, что это значит, и у меня нет никаких результатов (ответа нет, пока я не выпущу ctrl + c).
Ответы
Ответ 1
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.
Ответ 2
grep -nr string my_directory
Дополнительные примечания: это удовлетворяет синтаксису grep [options] string filename
, потому что в Unix-подобных системах каталог является своего рода файлом (существует термин "обычный файл", который специально относится к объектам, которые называются только "файлами" в Windows).
grep -nr string
считывает содержимое для поиска со стандартного ввода, поэтому он просто ждет от вас ввода и останавливается, когда вы нажимаете ^ C (он также останавливается на ^ D, что является комбинация клавиш для конца файла).
Ответ 3
GREP: глобальное регулярное выражение. Печать/анализ/процессор/программа.
Вы можете использовать это для поиска в текущем каталоге.
Вы можете указать -R для "рекурсивного", что означает, что программа выполняет поиск во всех подпапках и их подпапках, а также вложенных папках подпапок и т.д.
grep -R "your word" .
-n
будет печатать номер строки, где он сопоставляется в файле.
-i
будет искать регистр, нечувствительный к регистру (заглавные/непрописные буквы).
grep -inR "your regex pattern" .
Ответ 4
Там также:
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
, вы столкнетесь с проблемами с именами файлов, которые содержат пробелы, поэтому их использование является хорошей привычкой.
Ответ 5
grep -nr search_string search_dir
сделает RECURSIVE (что означает каталог и все его подкаталоги), поиск search_string. (как правильно ответил usta).
Причина, по которой вы не получали никаких предложений с предложением своего друга:
grep -nr string
заключается в том, что каталог не указан. Если вы находитесь в каталоге, в который хотите выполнить поиск, вы должны сделать следующее:
grep -nr string .
Важно включить '.' character, так как это говорит grep искать ЭТОЙ каталог.
Ответ 6
Почему бы не выполнить рекурсивный поиск, чтобы найти все экземпляры в подкаталогах:
grep -r 'text' *
Это работает как шарм.
Ответ 7
-
grep -r "yourstring" *
Найдет "yourstring" в любых файлах и папках.
Теперь, если вы хотите искать две разные строки одновременно, вы всегда можете использовать опцию E и добавлять слова для поиска. пример после перерыва
-
grep -rE "yourstring|yourotherstring|$" *
будет искать места списка, где yourstring
или yourotherstring
соответствует
Ответ 8
Другой вариант, который мне нравится использовать:
find folder_name -type f -exec grep your_text {} \;
-type f возвращает вам только файлы, а не папки
-exec и {} запускает grep для файлов, найденных в поиске (точный синтаксис: "-exec command {}" ).
Ответ 9
grep -R "string" /directory/
-R следует также по символическим ссылкам, когда -R нет.
Ответ 10
Ответ, который вы выбрали, хорош, и он работает, но это не правильный способ сделать это, потому что:
grep -nr yourString* .
Это фактически ищет строку "yourStrin"
и "g"
0 или много раз.
Таким образом, правильный способ сделать это:
grep -nr \w*yourString\w* .
Эта команда выполняет поиск строки с любым символом до и после в текущей папке.
Ответ 11
Подобно ответу, опубликованному @eLRuLL, более простой способ задать поиск, который учитывает границы слов, - это использовать -w
:
grep -wnr "yourString" .
Ответ 12
Не используйте grep. Загрузите Silver Searcher или ripgrep. Они оба выдающиеся, и быстрее, чем grep или ack с множеством опций.