Я хочу найти все файлы, которые содержат определенную строку текста. Команда grep
работает, но я не знаю, как использовать ее для каждого каталога (я могу сделать это только для моего текущего каталога). Я пытался читать man grep
, но это не помогло.
command-line
grep
Smile.Hunter
источник
источник
--include="*.C"
знак с параметром @ user311346, спасибо @Lekensteyn.Ответы:
Было бы лучше использовать
где
-r
(или--recursive
) опция используется для обхода также всех подкаталогов/path
, тогда как-l
(или--files-with-matches
) опция используется только для печати имен файлов совпадающих файлов, но не совпадающих строк (это также может повысить скорость, учитывая, чтоgrep
при первом совпадении прекращается чтение файла с этой опцией).источник
-rlF
переключатели-F
для «фиксированной строки» (а не регулярное выражение - например). Конечно, если в задании использовалось регулярное выражение, то извините. Конечно, та же самая теория без -r, я часто вижу, что люди предполагают, что grep ищет «текст», и это может вызвать проблемы, которые, в частности, означают что-то вроде регулярного выражения.-i
флаг, который игнорирует регистр.--recursive
вариант, есть множество вариантов и сценариев использования, о которых можно говорить. Я начал с принятого ответа @dmityugov и изменил, чтобы работать безfind
.--include '*.h'
Если вы ищете совпадения строк в файлах, моя любимая команда:
-H
вызывает печать имени файла (подразумевается при поиске нескольких файлов)-r
выполняет рекурсивный поиск-n
вызывает печать номера строкиpath/to/files
можно.
искать в текущем каталогеДругие варианты, которые я считаю очень полезными:
-I
игнорировать двоичные файлы (дополнение:-a
обрабатывать все файлы как текст)-F
трактоватьsearch term
как буквальное, а не регулярное выражение-i
выполнить поиск без учета регистра--color=always
заставлять цвета, даже когда пронзаетless
. Чтобы сделатьless
цвета поддержки, вам нужно использовать-r
опцию:--exclude-dir=dir
полезно для исключения каталогов, как.svn
и.git
.источник
-H
в папке является избыточным, если существует более одного файла, что является вероятным. На самом деле, на странице-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Я считаю, что вы можете использовать что-то вроде этого:
Объяснение из комментариев
find
это команда, которая позволяет вам находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах данного пути. Если вы не указываете маску, которой должны соответствовать имена файлов, она перечисляет все объекты каталога.-type f
указывает, что он должен обрабатывать только файлы, а не каталоги и т. д.-exec grep
указывает, что для каждого найденного файла он должен выполнить команду grep, передав ей имя файла в качестве аргумента, заменив{}
его именем файлаисточник
-name '*.py'
ограничивает совпадения для файлов, заканчивающихся на «.py».... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Моя команда по умолчанию
Я использую Капитолий 'R', потому что
ls
использует его для рекурсии. Поскольку grep принимает и то и другое, нет причин не использовать его.РЕДАКТИРОВАТЬ: согласно HVNSweeting, по-видимому,
-R
будет следовать символические ссылки, где, как-r
не будет.источник
shopt -s dotglob
(запомните-s
как «set»). Будьте осторожны при удалении файлов. Если вы включили dotglob,rm -r *
удаляет все в текущем каталоге , а также каталог над ним, потому что..
совпадает. Чтобы отключить dotglob, используйтеshopt -u dotglob
(«unset»). Изменения носят временный характер, это относится только к текущей оболочке.shopt -s dotglob & <grep cmd> & shopt -y dotglob
только удобнее? Таким образом, нам не придется беспокоиться о его сбросеgrep -Rin string .
в большинстве этих случаев. Я просто использую *, потому что это кажется более естественным.R
будет следовать символическим ссылкам,r
неЕсли вы хотите попробовать что-то новое, попробуйте
ack
. Команда для рекурсивного поиска в текущем каталогеstring
:Установка довольно проста:
(При условии, что у вас уже есть каталог,
~/bin
и он предпочтительно находится у васPATH
.)источник
chmod
команды? Они специфичны дляchmod
или связаны с bash (!#:3
часть)?!
это указатель события . Они довольно мощные, чтобы избежать повторений.!#:3
ссылается на третий токен командной строки, то есть~/bin/ack
в этом случае.Команда rgrep предназначена для такой необходимости.
Если нет в наличии, вы можете получить это так
Вы можете напрямую установить параметры по умолчанию в grep, как описано выше.
Я лично использую
Смежная тема: как всегда использовать rgrep с цветом
источник
Обновление 2:
Эта строка команд использует
find
иgrep
устраняет проблему:--color=<always or auto>
для цветного вывода:Пример:
Пример запуска в снимке ниже:
Обновление 1:
Вы можете попробовать следующий код; как функция в вашем
.bashrc
или.bash_aliases
или в скрипте:Использование:
wherein /path/to/search/in/ searchkeyword
пример:
(Примечание: как предложено в комментариях ниже @enzotib, это не работает с файлами / каталогами, включая пробелы в их именах.)
Оригинальный пост
Для поиска строки и вывода только этой строки вместе со строкой поиска:
например:
Чтобы отобразить имя файла, содержащее строку поиска:
например:
источник
grep
, за исключением того, что это подмножество, использующееfind
сgrep
..., но если вы хотите принять различные переключатели и настройки в качестве отдельного ответа, наверно мое тоже подойдет сюда .. или ты отличаешься? последнее обновление делает то, что я хотел бы в моем поиске: имена файлов со строками с ключом поиска и строкой №. тоже :) и цветной вывод и фильтр ошибок для лучшей читабельности ..grep
( GNU или BSD )Вы можете использовать
grep
инструмент для рекурсивного поиска текущей папки с-r
параметром, например:Примечание:
-r
- Рекурсивно ищите подкаталоги.Для поиска в определенных файлах вы можете использовать синтаксис типа:
Примечание. Используя параметр globbing (
**
), он рекурсивно сканирует все файлы с определенным расширением или шаблоном. Чтобы включить этот синтаксис, выполните следующую команду:shopt -s globstar
. Вы также можете использовать**/*.*
для всех файлов (за исключением скрытых и без расширения) или любой другой шаблон.Если вы ошиблись в том, что ваш аргумент слишком длинный, попробуйте сузить область поиска или используйте
find
вместо этого такой синтаксис, как:Альтернативно использовать
ripgrep
.ripgrep
Если вы работаете над большими проектами или большими файлами, вы должны использовать
ripgrep
вместо этого, например:Ознакомьтесь с документами, инструкциями по установке или исходным кодом на странице проекта GitHub .
Это гораздо быстрее , чем любой другой инструмент , как GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
или подобного, так как он построен на вершине регулярных выражений Руста , который использует конечные автоматы, SIMD и агрессивные буквенные оптимизации , чтобы сделать поиск очень быстро.Он поддерживает шаблоны игнорирования, указанные в
.gitignore
файлах, поэтому один путь к файлу можно сопоставить с несколькими шаблонами глобуса одновременно.Вы можете использовать общие параметры, такие как:
-i
- Нечувствительный поиск.-I
- игнорировать двоичные файлы.-w
- Поиск целых слов (в отличие от частичного совпадения слов).-n
- Показать линию вашего матча.-C
/--context
(например-C5
) - Увеличивает контекст, поэтому вы видите окружающий код.--color=auto
- Отметьте соответствующий текст.-H
- Отображает имя файла, где находится текст.-c
- Отображает количество совпадающих линий. Может сочетаться с-H
.источник
Я делаю это с помощью xargs, очень недооцененной команды
find ./ дает вам рекурсивный список всех файлов в текущей папке, а затем вы передаете его xargs, который выполняет команду grep для каждого из этих файлов.
источник
xargs
без-print0
параметров tofind
и-0
optionxargs
устарело, оно не будет работать с именами файлов, содержащими пробелы.Я знаю, что здесь есть много ответов, но вот альтернатива, если вы хотите добавить другие ограничения при поиске файлов:
Это работает, потому
grep
что вернет 0, если он нашел результат, 1 в противном случае. Например, вы можете найти файлы размером 1 МБ и содержащие что-то:Для множества требований вы, вероятно, захотите использовать флаг оптимизатора
-O
, существующий в GNU grep.источник
Скрипт (find-in-code) для поиска в C, код CPP:
Использование:
источник