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

  1. 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 с множеством опций.