[2-57]
é um conjunto de caracteres consistindo de 2
, 3
, 4
, 5
e 7
, em zsh e qualquer outro wildcard e sintaxe regexp lá fora. Seu padrão glob *[2-57]
corresponde a todos os nomes de arquivos cujo último caractere é um desses cinco dígitos.
Eu acho que você está se lembrando mal da sintaxe do [m,n]
qualificador glob . Os qualificadores de globos sempre aparecem entre parênteses no final do padrão, e o separador de intervalo é uma vírgula. O padrão se *([2,57])
expande para a 2ª, 3ª,…, 57ª correspondências. A ordem de expansão padrão é lexicográfica (com alguma mágica especial para classificar números em ordem numérica, se a numeric_glob_sort
opção estiver configurada); você pode controlá-lo com o qualificador o
ou O
glob (por exemplo, *(om[2,57])
para corresponder ao 57 arquivo mais recente, exceto o arquivo mais recente).
for x in /foo/bar/*([2,57]); do print $x; done
Não o que você pediu, mas relacionado e possivelmente útil para futuros leitores: se você quiser enumerar os arquivos 2 a 57, se eles existem ou não, é possível usar uma expressão de intervalo entre chaves . Esse recurso também existe no bash e no ksh.
echo hello{2..57}
E se você deseja combinar arquivos cujo nome contém um número entre 2 e 57, você pode usar o padrão <2-57>
. Isso é específico para o zsh.
$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57
Observe que um padrão como *<2-57>
provavelmente não faz o que você espera, porque também *
pode corresponder a dígitos. Por exemplo, file58
corresponde *<2-57>
, com a file5
correspondência da *
parte e 8
a <2-57>
parte. O padrão *[^0-9]<2-57>
evita esse problema.