Как ограничить grep только для поиска файлов, которые вы хотите - PullRequest
4 голосов
/ 18 августа 2011

У нас довольно большая и сложная файловая система, и я пытаюсь создать список файлов, содержащих определенную текстовую строку. Это должно быть просто, но мне нужно исключить каталоги './svn' и './pdv' (и, возможно, другие) и просматривать только файлы типа * .p, * .w или .i *. 1002 *.

Я легко могу сделать это с помощью программы, но она работает очень медленно. Я хочу ускорить процесс (чтобы я не выполнял поиск в тысячах файлов неоднократно), так как мне нужно выполнить такой поиск по длинному списку критериев.

Обычно мы ищем файловую систему, используя:

find . -name "*.[!r]*" -exec grep -i -l "search for me" {} \;

Это работает, но мне приходится использовать программу для исключения нежелательных каталогов, поэтому она работает очень медленно.

После просмотра тем здесь: поток переполнения стека

Я решил попробовать несколько других подходов:

grep -ilR "search for me" . --exclude ".svn" --excluse "pdv" --exclude "!.{p,w,i*}" 

Исключает каталоги ./svn, но не каталоги ./pdv. Не ограничивает количество просматриваемых файлов.

grep -ilR "search for me" . --exclude ".svn" --excluse "pdv" --include "*.p" 

За исключением каталогов.

find . -name "*.[!r]*" -exec grep -i -l ".svn" | grep -i -l "search for me" {} \;

Я даже не могу заставить это (или варианты) успешно работать.

find . ! -name "*.svn*" -prune -print -exec grep -i -l "search for me" {} \;

ничего не возвращает. Похоже, что он останавливается, как только находит каталог .svn.

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

Как насчет чего-то вроде:

find . \( \( -name .svn -o -name pdv \) -type d -prune \) -o \( -name '*.[pwi]' -type f -exec grep -i -l "search for me" {} + \)

Это будет:
- игнорировать содержимое каталогов с именами .svn и pdv
- файлы grep (и ссылки на файлы) с именем *. [pwi]

Параметр + после exec означает, что в одну команду можно собрать столько файлов, сколько уместится в командной строке (примерно 1 миллион символов в Linux).Это может серьезно ускорить обработку, если вам придется перебирать тысячи файлов.

2 голосов
/ 19 августа 2011

Следующая команда находит только файлы * .rb, содержащие строку require 'bundler/setup', и исключает поиск в каталогах .git и .bundle. Я думаю, это тот же вариант использования.

grep -ril --exclude-dir .git --exclude-dir .bundle \
  --include \*.rb "^require 'bundler/setup'$" .

Проблема заключалась в замене параметров --exclude и --exclude-dir. Обратитесь к руководству grep(1).

Также обратите внимание, что параметры exclude / include принимают только GLOB, но не регулярные выражения, поэтому диапазон суффиксов из одного символа может быть задан одним параметром --include, но для более сложных условий потребуется больше параметров:

--include \*.[pwi] --include \*.multichar_sfx ...
0 голосов
/ 18 августа 2011
find . -name "filename_regex"|grep -v '.svn' -v '.pdv'|xargs grep -i 'your search string'
0 голосов
/ 18 августа 2011

Вы можете попробовать следующее:

find path_starting_point -type f | grep regex_to_filter_file_names | xargs grep regex_to_find_inside_matched_files
...