Как я могу искать в моем дереве каталогов содержимое файла, управляемого 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
полезность:
- Для поиска строки в дереве каталогов рекурсивно:
использовать: grep -rl alvin .
- Поиск по нескольким подкаталогам:
Ваш рекурсивный grep
поиски не должны быть ограничены только текущим каталогом. В следующем примере показано, как выполнить рекурсивный поиск в двух несвязанных каталогах для строки без учета регистра "alvin":
grep -ril alvin /home/cato /htdocs/zenf
- Использование 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
Если вы беспокоитесь о медленном поиске в больших проектах, вам стоит взглянуть на Серебряный поисковик. Это очень быстро. Тестовый запуск для строки "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