Поиск строк: использование find/grep, игнорируя .git и другие каталоги

Мне часто нужно искать определенную строку в каталоге с каталогом git .git/. Это команда, которую я использую:

find . -name .git -prune -o -print | xargs grep <string-to-search>

Опция -name .git -prune -o -print — игнорировать файлы под .git/. Однако он выводит много сообщений "Is a directory", которые загромождают весь результат. Например,

...
grep: ./reports: Is a directory
grep: ./scripts: Is a directory
grep: ./scripts/js: Is a directory
grep: ./scripts/js/adapter: Is a directory
...

Как изменить командную строку, чтобы я мог игнорировать каталог .git/ и все остальные каталоги (т. е. выполнять поиск только в доступных для поиска файлах).

По-видимому, вариант -type f плохо работает в:

find -type f . -name .git -prune -o -print

person moey    schedule 01.01.2013    source источник
comment
Почему вы не используете git-grep?   -  person Johnsyweb    schedule 01.01.2013
comment
Кроме того, эта последняя команда должна быть find . -type f -name .git -prune -o -print.   -  person Johnsyweb    schedule 01.01.2013
comment
Спасибо, @Johnsyweb. find . -type f -name .git -prune -o -print на самом деле все еще выводит каталоги.   -  person moey    schedule 01.01.2013
comment
Вы правы — гораздо проще использовать git-grep: git grep --untracked <string-to-search>. Позвольте мне оставить этот вопрос открытым; Мне все еще любопытно, как бы мы это сделали, используя комбинацию grep и find.   -  person moey    schedule 01.01.2013
comment
Что делать, если у вас есть несколько .git, клонированных из разных мест (например, с использованием repo), может git-grep (или какой-то другой инструмент) справиться с этим?   -  person OLL    schedule 21.03.2017


Ответы (4)


Вам не требуется команда find. Вы можете использовать grep для поиска в каталоге. Вы можете игнорировать каталог, используя синтаксис exclude-dir.

grep -r --exclude-dir=".git;.svn" "string to search" <directory>
person Vivek Goel    schedule 01.01.2013
comment
NB: для этого требуется GNU Grep (›= 2.5.2). - person Johnsyweb; 01.01.2013
comment
Любая альтернатива для grep (BSD grep) 2.5.1-FreeBSD? Спасибо! - person moey; 01.01.2013
comment
найти . -not -iwholename '.git' - person Vivek Goel; 01.01.2013
comment
добавить в пайплайн промежуточный анит-греп, т.е. grep -r ... | egrep -v '\.svn|\.git' | ..... Всем удачи. - person shellter; 02.01.2013
comment
Это не сработало для меня с ; разграниченные пути. Попробуйте один каталог, если у вас есть какие-либо проблемы - person Miquel; 22.08.2015
comment
Проголосовал за, потому что это хорошо работает с несколькими репозиториями .git при использовании repo. Однако мне пришлось разделить разделитель файлов ; следующим образом: grep -R --exclude-dir=".git" --exclude-dir=".svn" MyRegex - person OLL; 21.03.2017

Отвечая на мой собственный вопрос здесь (без голосов и т. д.):

Поскольку я, по сути, выполнял поиск именно в git-отслеживаемом каталоге, git grep, по-видимому, является гораздо более простым и подходящим инструментом для этой работы. Спасибо @Johnsyweb, который изначально поднял эту тему!

Я выбрал ответ Вивека, потому что он дает общее решение grep, заданное в исходном вопросе.

person moey    schedule 27.02.2013

-тип f неуместен. Он отфильтровывает каталоги перед параметром -prune, который ожидает имя каталога. Команда должна быть find . -name .git -prune -o -type f -print. Если вы просто хотите, чтобы grep заткнулся о каталогах, вы можете установить переменную окружения GREP_OPTIONS='--directories=skip'

person dmearns    schedule 11.07.2014

Рекомендуем попробовать ripgrep https://github.com/BurntSushi/ripgrep

ripgrep — это инструмент построчного поиска, который рекурсивно ищет в текущем каталоге шаблон регулярного выражения. По умолчанию ripgrep будет соблюдать правила gitignore и автоматически пропускать скрытые файлы/каталоги и двоичные файлы.

person DBCerigo    schedule 14.07.2021