Добавить комментарий о --exclude-dirпроизводительности выступления и у нас есть победитель!
Данкрамб
1
Просто обратите внимание, что это не переносимо, однако grepна последних дистрибутивах FreeBSD и Linux это поддерживается. А почему --exclude-dir? Разве вы не просили обыскать целое дерево ?
Филиппос
Честное замечание ... --exclude-dirна самом деле удобно в моем случае использования (потому что части поддерева большие, но бесполезные), и я спросил о производительности ... но вы правы, в этом нет необходимости.
Данкрамб
В этом случае я должен добавить, что IIRC --exclude-dirявляется эксклюзивным для GNU grep. (-:
Филиппос
13
Субоптимальный ответ: вместо того, чтобы передать результаты findв grep, вы можете просто запустить
find . -type f -exec grep 'research' {} '+'
и вуаля, одна команда вместо двух!
объяснение:
find . -type f
найти все обычные файлы в.
-exec grep 'research'
grep 'исследование'
{}
в найденном имени файла
'+'
используйте одну команду для всех имен файлов, а не один раз для каждого имени файла.
Nb: с ';'этим было бы один раз за имя файла.
Помимо этого, если вы используете это для обработки исходного кода, вы можете посмотреть ack, что сделано для легкого поиска битов кода.
Вы можете немного расширить это исследование. Во-первых, вы можете использовать -name ''переключатель findдля поиска файлов с указанным шаблоном именования.
Например :
только файлы, которые соответствуют журналам: -name '*.log'
только файлы, которые соответствуют заголовкам c, но вы не можете использовать прописные или строчные буквы для своих расширений файлов: -iname *.c
Nb: как для grepи ack, -iпереключатель означает, что в этом случае не учитывается регистр.
В этом случае grep будет отображаться без цвета и без номеров строк.
Вы можете изменить это с --colorи -nпереключатели (цвет и линий чисел в файлах , соответственно).
Используйте -rвместо -Rпропуска символических ссылок, когда дело касается GNU grep
αғsнιη
1
@AFSHIN Почему бы вам не перейти по символическим ссылкам?
Кусалананда
4
@ Кусалананда рекурсия? Хотя текущие grepреализации GNU ловят рекурсии, я думаю. В противном случае это зависит от того, что вы подразумеваете под «деревом».
Филиппос
2
@Philippos ИМХО, присмотр за пользователем - это не то, что grepдолжен делать инструмент, подобный этому. Если у пользователя есть символьные циклы ссылок в его структуре каталогов, ну, это проблема пользователя :-)
Kusalananda
3
@Kusalananda А если система обеспечит цикл? Никогда не заблудился /sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...(-XI, как инструменты, присматривающие за мной (если они не обеспечивают странную магию, которую они называют «ИИ»). (-;
Philippos
5
Как отмечено выше -rили -R(в зависимости от желаемой обработки символической ссылки), это быстрый вариант.
Однако -d <action>может быть полезным в разы.
Приятной особенностью -dявляется команда skip, которая отключает "grep: directory_name: Is a directory", когда вы просто хотите просканировать текущий уровень.
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
и конечно:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
Эта -d skipопция ДЕЙСТВИТЕЛЬНО удобна внутри другого скрипта, поэтому вам не нужно это делать 2> /dev/null. :)
Если вы имеете дело с большим количеством файлов, grep работает быстрее, если вы удаляете файлы, которые необходимо найти, вместо того, чтобы подбирать все файлы в подпапках.
Я использую этот формат иногда:
grep "primary" `find . | grep cpp$`
Найти все файлы в подпапках .этого конца вcpp . Затем grep эти файлы для "основного".
Если вы хотите, вы можете продолжать передавать эти результаты в дальнейшие вызовы grep:
Backtics не являются хорошей современной практикой, они почти устарели
Кристофер
1
Это сломается, если у вас есть файлы со специальными символами в именах. Я не знаю, насколько они должны быть особенными, чтобы быть слишком особенными для того, чтобы это работало как есть, но то, что вы делаете, - это почти то же самое, что парсинг вывода ls, что тоже плохо.
Ответы:
Проверьте,
grep
поддерживает ли ваш-r
вариант поддержки (для рекурса ):источник
--exclude-dir
производительности выступления и у нас есть победитель!grep
на последних дистрибутивах FreeBSD и Linux это поддерживается. А почему--exclude-dir
? Разве вы не просили обыскать целое дерево ?--exclude-dir
на самом деле удобно в моем случае использования (потому что части поддерева большие, но бесполезные), и я спросил о производительности ... но вы правы, в этом нет необходимости.--exclude-dir
является эксклюзивным для GNUgrep
. (-:Субоптимальный ответ: вместо того, чтобы передать результаты
find
вgrep
, вы можете просто запуститьи вуаля, одна команда вместо двух!
объяснение:
найти все обычные файлы в.
grep 'исследование'
в найденном имени файла
используйте одну команду для всех имен файлов, а не один раз для каждого имени файла.
Nb: с
';'
этим было бы один раз за имя файла.Помимо этого, если вы используете это для обработки исходного кода, вы можете посмотреть
ack
, что сделано для легкого поиска битов кода.извед
Редактировать :
Вы можете немного расширить это исследование. Во-первых, вы можете использовать
-name ''
переключательfind
для поиска файлов с указанным шаблоном именования.Например :
только файлы, которые соответствуют журналам:
-name '*.log'
только файлы, которые соответствуют заголовкам c, но вы не можете использовать прописные или строчные буквы для своих расширений файлов:
-iname *.c
Nb: как для
grep
иack
,-i
переключатель означает, что в этом случае не учитывается регистр.В этом случае grep будет отображаться без цвета и без номеров строк.
Вы можете изменить это с
--color
и-n
переключатели (цвет и линий чисел в файлах , соответственно).В конце концов, вы можете получить что-то вроде:
например
источник
ack
является большим, и более быстрая версияack
ISag
(серебряный поисковое, geoff.greer.fm/ag )-name '*.log'
это быстрее.Если вы хотите перейти в подкаталоги:
Эта
-R
опция не является стандартной, но поддерживается большинством распространенныхgrep
реализаций.источник
-r
вместо-R
пропуска символических ссылок, когда дело касается GNU grepgrep
реализации GNU ловят рекурсии, я думаю. В противном случае это зависит от того, что вы подразумеваете под «деревом».grep
должен делать инструмент, подобный этому. Если у пользователя есть символьные циклы ссылок в его структуре каталогов, ну, это проблема пользователя :-)/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(-XI, как инструменты, присматривающие за мной (если они не обеспечивают странную магию, которую они называют «ИИ»). (-;Как отмечено выше
-r
или-R
(в зависимости от желаемой обработки символической ссылки), это быстрый вариант.Однако
-d <action>
может быть полезным в разы.Приятной особенностью
-d
является команда skip, которая отключает "grep: directory_name: Is a directory", когда вы просто хотите просканировать текущий уровень.и конечно:
Эта
-d skip
опция ДЕЙСТВИТЕЛЬНО удобна внутри другого скрипта, поэтому вам не нужно это делать2> /dev/null
. :)источник
Если вы имеете дело с большим количеством файлов, grep работает быстрее, если вы удаляете файлы, которые необходимо найти, вместо того, чтобы подбирать все файлы в подпапках.
Я использую этот формат иногда:
Найти все файлы в подпапках
.
этого конца вcpp
. Затем grep эти файлы для "основного".Если вы хотите, вы можете продолжать передавать эти результаты в дальнейшие вызовы grep:
источник