Se eu entendi corretamente, você está procurando algo como:
find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
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
.
Se eu entendi corretamente, você está procurando algo como:
find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
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'