Рекурсивный grep в определенных подкаталогах - PullRequest
0 голосов
/ 17 мая 2018

Я хочу выполнить поиск определенных файлов, которые существуют только под конкретным подкаталогом.Здесь я хочу, чтобы .xml файлы существовали только в подкаталоге /bar/:

./file0.xml
./.git/file1a.xml
./.git/bar/file1b.xml
./.svn/file2a.xml
./.svn/foo/bar/baz/file2b.xml
./path1/file3.xml
./path1/foo/file4.xml
./path2/foo/bar/file5.xml
./path2/foo/baz/file6.xml
./path3/bar/file7.xml
./path3/foo/bar/baz/file8.xml

. Я хочу, чтобы только следующие файлы были выделены: file5.xml, file7.xml, file8.xml

Чтобы исключить .git и .svn, я придумал:

grep -r --exclude-dir={.git,.svn} --include=\*.xml "pattern"

, который все еще ищет file3.xml до file8.xml.

Если я grep -v нежелательных каталогов:

grep -r --exclude-dir={.git,.svn} --include=\*.xml "pattern" | grep -v /bar/

Я получаю желаемые результаты, но это занимает много времени при разборе файлов не /bar/.

Используя find, чтобы найти xml-файлы в /res/, я получаю желаемые результаты (и это намного быстрее, чем приведенный выше результат):

find . -type d \( -name .git -o -name .svn \) -prune -o \
       -path '*/bar/*.xml' -exec grep "pattern" {} +

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

Есть ли способ сделать это, используя только grep (так что это неt запретить пользователю указывать дополнительные параметры grep и / или запускать каталоги поиска)?Возможно что-то вроде:

grep -r --exclude-dir={.git,.svn} --include=\*/bar/\*.xml "pattern"

1 Ответ

0 голосов
/ 17 мая 2018

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

search() {
    local dir=$1
    local pattern=$2
    local args=("${@:3}")

    find "$dir" -type d \( -name .git -o -name .svn \) -prune -o \
        -path '*/bar/*.xml' -exec grep "${args[@]}" "$pattern" {} +
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...