Grep apenas em arquivos que estão em determinadas pastas

2

Desejo grep para interesting string , mas apenas em combinações específicas de pastas / arquivos, como myfolder/myfile.out .

O diretório que estou usando pode ter essas combinações em subdiretórios de diferentes profundidades (caso contrário eu poderia apenas grep 'interesting string' myfolder/myfile.out ) e também não quero obter resultados de qualquer myfile.out que esteja localizado em um diretório com um nome diferente, por exemplo, /deeply/nested/directory/structure/myfolder/myfile.out deve ser grep, mas não /deeply/nested/directory/structure/notmyfolder/myfile.out .

    
por snurden 02.03.2016 / 10:55

2 respostas

2

Se eu entendi corretamente, você está procurando algo como:

find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
    
por 02.03.2016 / 11:12
1

Em zsh, a **/ glob significa “em qualquer nível de diretório aninhamento ”:

grep 'interesting string' **/myfolder/myfile.out

No bash: shopt -s globstar , como acima. Tenha em atenção que no bash ≤4.2 isto atravessa links simbólicos para diretórios. Este recurso ainda não existe na versão antiga do bash no OSX.

Em ksh93: set -G , como acima.

Isso pode falhar se o comprimento total dos nomes dos arquivos for muito longo. Nesse caso, você pode voltar a chamar find , que executará grep em lotes:

find -path '*/myfolder/myfile.out' -exec grep -H 'interesting string' {} +

ou se você não puder confiar nas ferramentas GNU:

find -name myfolder -exec sh -c 'grep "$0" /dev/null "$1/myfile.out"' 'interesting string' {} \;

no entanto, se você tiver zsh, mais uma vez ela será salva com zargs :

zargs -- **/myfolder/myfile.out -- grep 'interesting string' /dev/null

Uma abordagem diferente é usar uma ferramenta diferente que combina o grep e a travessia de diretórios de maneiras mais extravagantes do que o grep do GNU. Por exemplo, você pode usar o pesquisador de prata :

ag -G '/myfolder/myfile\.out$' 'interesting string'
    
por 03.03.2016 / 02:32