В Windows я бы сделал поиск для поиска слова внутри папки. Точно так же я хочу знать, встречается ли определенное слово в каталоге, содержащем много подкаталогов и файлов. Мои поиски для Grep синтаксиса показывает , я должен указать имя файла, то есть grep string filename
.
Теперь я не знаю имя файла, так что мне делать? Друг предложил сделать grep -nr string
, но я не знаю, что это значит, и я не получил никаких результатов (ответа пока нет ctrl + c).
*
? Это приведет либо к расширению подстановочного знака оболочки (если есть имена файлов, соответствующие шаблону подстановки), либо grep примет его как оператор повторения 0 или более для предшествующего символа*
.grep -nr MobileAppSer* .
1. Предположим , у нас есть 3 файлов в текущем каталоге соответствияMobileAppSer*
шаблону: по имениMobileAppServlet.java
,MobileAppServlet.class
,MobileAppServlet.txt
. Тогдаgrep
будет вызван следующим образом:grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .
. Это означает поиск текста «MobileAppServlet.class» в файлах MobileAppServlet.java, MobileAppServlet.txt и в других местах в текущем каталоге - что, безусловно, не то, что пользователь хочет здесь.MobileAppSer*
шаблону с подстановочными знаками,grep
он получит аргумент «MobileAppSer*
как есть» и, таким образом, примет его как поиск текста «MobileAppSe», за которым последует 0 или более вхождений «r», поэтому он будет попытаться найти тексты «MobileAppSe», «MobileAppSer», «MobileAppSerr», «MobileAppSerrr» и т. д. в содержимом файлов текущего каталога - не то, что хочет пользователь.Дополнительные примечания: это удовлетворяет синтаксису,
grep [options] string filename
потому что в Unix-подобных системах каталог является своего рода файлом (существует термин «обычный файл», который специально относится к сущностям, которые в Windows называются просто «файлами»).grep -nr string
читает содержимое для поиска из стандартного ввода, поэтому он просто ждет ввода от вас и перестает делать это, когда вы нажимаете ^ C (это также останавливается на ^ D, который является комбинацией клавиш для конца -файл).источник
grep -inr "my word" .
-r
for grep означает рекурсивный поиск в подкаталогах и-n
означает префикс каждой строки вывода с соответствующим номером строки файла, который содержит эту строку.man grep
описывает все это и многое другое.GREP : Глобальный Регулярный Выражение Печать / Парсер / Процессор / Программа.
Вы можете использовать это для поиска в текущем каталоге.
Вы можете указать -R для «рекурсивный», что означает, что программа выполняет поиск во всех подпапках, их подпапках, подпапках их подпапок и т. Д.
-n
напечатает номер строки, где он соответствует в файле.-i
будет искать без учета регистра (заглавные / не заглавные буквы).источник
выполнит RECURSIVE (имеется в виду каталог и все его подкаталоги) поиск строки поиска. (как правильно ответил уста).
Причина, по которой вы не получили никаких возражений с предложением вашего друга:
потому что каталог не был указан. Если вы находитесь в каталоге, в котором вы хотите выполнить поиск, вы должны сделать следующее:
Важно включить «.» символ, как это говорит grep искать в этом каталоге.
источник
Есть также:
но это может быть немного много для новичка.
find
является каталогом общего назначения walker / lister,-type f
означает «искать простые файлы, а не каталоги и именованные каналы и что у вас есть»,-print0
означает «выводить их на стандартный вывод, используя нулевые символы в качестве разделителей». Выходные данные отfind
отправляютсяxargs -0
и получают его стандартный ввод кусками (чтобы избежать ограничений длины командной строки), используя нулевые символы в качестве разделителя записей (а не стандартный перевод строки), и применяютсяgrep -li word
к каждому набору файлов. Наgrep
,-l
означает «список файлов, которые соответствуют» и-i
означает «без учета регистра»; обычно вы можете комбинировать параметры одного символа, чтобы вы видели-li
чаще-l -i
.Если вы не используете,
-print0
и-0
тогда у вас возникнут проблемы с именами файлов, которые содержат пробелы, поэтому их использование - хорошая привычка.источник
man find
из командной строки, чтобы увидеть, какие опции выfind
поддерживаете.Почему бы не выполнить рекурсивный поиск, чтобы найти все экземпляры в подкаталогах:
Это работает как шарм.
источник
grep -r "yourstring" *
Найдет "yourstring" в любых файлах и папкахТеперь, если вы хотите искать две разные строки одновременно, вы всегда можете использовать опцию E и добавить слова для поиска. пример после перерыва
grep -rE "yourstring|yourotherstring|$" *
будет искать список мест, гдеyourstring
илиyourotherstring
совпадаетисточник
Еще один вариант, который мне нравится использовать:
-type f возвращает вам только файлы, а не папки
-exec и {} запускает grep для файлов, которые были найдены в поиске (точный синтаксис "-exec command {}").
источник
-R следует также по символическим ссылкам, когда -r нет.
источник
Ответ, который вы выбрали, хорош, и он работает, но это не правильный способ сделать это, потому что:
Это фактически ищет строку
"yourStrin"
и"g"
0 или много раз.Таким образом, правильный способ сделать это:
Эта команда ищет строку с любым символом до и после в текущей папке.
источник
grep -nr yourString
работает тоже, так как он ищет пустое место вyourString
любом месте строки (или, по крайней мере, в моей системе, OSX Lion)Подобно ответу, опубликованному @eLRuLL, более простой способ задать поиск, который учитывает границы слов, состоит в использовании
-w
опции:источник
Запустите (терминал) следующую команду внутри каталога. Он также будет рекурсивно проверять внутри подкаталогов.
источник
Следующие образцы выглядит рекурсивно для
your search string
в*.xml
и*.js
файлы , расположенные где - то внутри папкиpath1
,path2
иpath3
.Таким образом, вы можете искать в подмножестве файлов множество каталогов, просто указав пути в конце.
источник
Не используйте grep. Загрузите Silver Searcher или ripgrep . Они оба выдающиеся, и намного быстрее, чем grep или ack с тоннами опций.
источник