Curinga para profundidade arbitrária

3

Eu quero usar grep , onde os caminhos são arbitrariamente profundos sob o diretório /path/to/dir e tem o nome do arquivo foo . Eu pensei que o curinga para a profundidade arbitrária é ** , e eu tentei

grep some_pattern /path/to/dir/**/foo

mas parece estar correspondendo apenas aos arquivos em que a parte ** representa uma profundidade de diretório única como

/path/to/dir/bar/foo

Como posso corresponder caminhos para profundidade arbitrária que está sob o diretório /path/to/dir e tem o nome do arquivo foo ?

    
por sawa 23.09.2014 / 17:19

2 respostas

3

Use zsh. Na página man zshexpn (1), Seção "Recursive Globbing":

A pathname component of the form '(foo/)#' matches a path consisting of zero or more directories matching the pattern foo.

As a shorthand, '**/' is equivalent to '(*/)#'; note that this therefore matches files in the current directory as well as subdirectories.

[...] This form does not follow symbolic links; the alternative form '***/' does, but is otherwise identical.

Isso também significa que ** não inclui diretórios ocultos (cujo nome começa com um ponto) por padrão. Se você quiser combiná-los, defina a opção GLOB_DOTS ou use o qualificador D glob:

grep some_pattern /path/to/dir/**/foo(D)

Com o bash, você precisa definir explicitamente a opção globstar para tornar ** work:

shopt -s globstar
    
por 23.09.2014 / 21:26
2

Além da sugestão de vinc17, você pode usar --include combinado com -r option , algo como:

grep -r --include \foo some_pattern /path/to/dir/*.
    
por 23.09.2014 / 21:34