Как я могу искать в моем дереве каталогов содержимое файла, управляемого git-проектом?

Мне нравится юникс find команда, но я всегда нахожу ее слишком "неудобной" для использования, когда я хочу выполнить поиск по своему проекту, ища фрагмент текста в любом файле в любом каталоге или подкаталоге.
Есть ли более простой способ сделать это?

4 ответа

Решение

git grep "ваша текстовая строка" из базового каталога приложения - отличный способ сделать это.

Также, как указывает Кристофер ack Полезно.

Его метод установки не работает для меня. Я должен был сделать:

sudo apt-get install ack-grep

а потом для удобства

alias ack='ack-grep '  # So that I can just type ack "string"

который я также добавлю к своему ~/.bash_aliases файл.

Пытаться grep полезность:

  1. Для поиска строки в дереве каталогов рекурсивно:

использовать: grep -rl alvin .

  1. Поиск по нескольким подкаталогам:

Ваш рекурсивный grep поиски не должны быть ограничены только текущим каталогом. В следующем примере показано, как выполнить рекурсивный поиск в двух несвязанных каталогах для строки без учета регистра "alvin":

grep -ril alvin /home/cato /htdocs/zenf
  1. Использование egrep рекурсивно:

Вы также можете выполнить рекурсивный поиск с помощью egrep Команда, которая позволяет вам искать несколько шаблонов одновременно.

egrep -ril 'aja|alvin' .

Обратите внимание, что в этом случае кавычки необходимы вокруг шаблона поиска.

Резюме: grep -r отмечает:

Несколько заметок о grep -r команда:

  • Эта команда grep не имеет большого смысла, если вы не используете ее также с флагом -l (строчная буква "L"). Этот флаг указывает grep напечатать соответствующие имена файлов.

  • Не забудьте перечислить один или несколько каталогов в конце вашей команды grep. Если вы забудете добавить какие-либо каталоги, grep будет пытаться читать со стандартного ввода (как обычно).

  • Как показано, вы можете использовать и другие обычные флаги grep, включая -i, чтобы игнорировать регистр, -v, чтобы изменить смысл поиска и т. Д.

git grep Это один из способов сделать это, но он будет игнорировать неотслеживаемые файлы (так что это не совсем то же самое, что вы делаете с find). Несколько других способов избежать этого findЛюбопытный синтаксис:

grep -r "<string>" /path/to/repo

Вы также можете попробовать мой личный фаворит grep альтернатива, ack, которая превосходит оба grep а также git grep в моем анекдотическом опыте:

ack "<string>" /path/to/repo ;# path is unnecessary if you're already in the repo

Grep - самый простой подход.

grep -r 'text to find' .

Если вы беспокоитесь о медленном поиске в больших проектах, вам стоит взглянуть на Серебряный поисковик. Это очень быстро. Тестовый запуск для строки "TODO" в проекте длиной 75 000 строк занял менее 10 мс.

Выдержка из README:

Что такого хорошего в Ag?

  • Это на порядок быстрее, чем ack.
  • Он игнорирует шаблоны файлов из ваших.gitignore и.hgignore.
  • Если в вашем исходном репо есть файлы, которые вы не хотите искать, просто добавьте их шаблоны в файл.ignore. (кашель *.min.js кашель)
  • Имя команды на 33% короче, чем ack, и все ключи находятся в главном ряду!

Аг вполне устойчив сейчас. Большинство изменений - это новые функции, небольшие исправления ошибок или улучшения производительности. Это намного быстрее, чем Ack в моих тестах:

ack test_blah ~/code/  104.66s user 4.82s system 99% cpu 1:50.03 total

ag test_blah ~/code/  4.67s user 4.58s system 286% cpu 3.227 total

Ack и Ag нашли те же результаты, но Ag был в 34 раза быстрее (3,2 секунды против 110 секунд). Мой каталог ~/code составляет около 8 ГБ. Благодаря git/hg/ignore Ag искал только 700 МБ.

Его можно установить через большинство репозиториев пакетов, например:

apt-get install silversearcher-ag

Смотрите README для получения дополнительных инструкций.

Другие вопросы по тегам