File glob para coincidir com "version" e "version.h"

1

Estou tentando usar find para identificar todos os arquivos em meu repositório nomeados como "version" ou "version.h", no entanto, não consigo criar uma glob válida para corresponder a.

Com o regex, acredito que isso funcionaria: .*/version\.*h*

Mas não consigo criar um equivalente na sintaxe glob.

    
por Adrian Padin 05.12.2017 / 19:03

1 resposta

5

But I cannot come up with an equivalent in glob syntax.

Eu não acho que você pode, já que globs regulares não têm alternância ou agrupamento. O mais próximo que você poderia conseguir seria version* , mas claro que isso também combina com outros.

Embora com um glob estendido no estilo ksh ou com zsh, você pode:

(Bash)

$ shopt -s globstar
$ shopt -s extglob
$ echo **/version?(.h)

(ksh)

$ set -o globstar
$ echo **/version?(.h)

(zsh)

% echo **/version(|.h) 

Muitas versões de find também podem usar regexes, mas as variantes de regex disponíveis são diferentes. O BSD find padroniza as regexes básicas (BRE), mas suporta regexes estendidas com o sinal -E :

$ find -E . -regex ".*/version(\.h)?"

No GNU find , o padrão é diferente (*) , mas:

$ find . -regextype posix-extended -regex ".*/version(\.h)?"

Ou você poderia usar a solução simples, que Jeff sugeriu:

$ find . -name version -o -name version.h

Tenha em atenção que, se adicionar uma ação explícita (em vez da impressão predefinida), necessita de parênteses como em:

$ find . \( -name version -o -name version.h \) -a -exec ls -ld {} +

como -a (implícito quando omitido) tem precedência sobre -o .

(* na verdade, o manual de referência para o GNU find não parece ser capaz de decidir qual é o formato de regex padrão, compare o exemple duas entradas aqui .)

    
por 05.12.2017 / 19:22