[2-57]
é um conjunto de caracteres que consiste em 2
, 3
, 4
, 5
e 7
, em zsh e todas as outras sintaxes de caracteres curinga e expressões regulares no mercado. Seu padrão de glob *[2-57]
corresponde a cada nome de arquivo cujo último caractere é um desses cinco dígitos.
Acho que você está se lembrando incorretamente da sintaxe do [m,n]
qualificador da glob . Qualificadores de Glob sempre ficam entre parênteses no final do padrão, e o separador de intervalo é uma vírgula. O padrão *([2,57])
se expande para o 2º, 3º, ..., 57º. A ordem de expansão padrão é lexicográfica (com alguma mágica especial para classificar números em ordem numérica se a opção numeric_glob_sort
estiver configurada); você pode controlá-lo com o qualificador o
ou O
glob (por exemplo, *(om[2,57])
para corresponder ao 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, independentemente de existirem ou não, você pode usar um intervalo expressão de colchetes . Este recurso também existe em bash e ksh.
echo hello{2..57}
E se você quiser corresponder arquivos cujo nome contenha um número entre 2 e 57, use o padrão <2-57>
. Isso é específico para 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 fará o que você espera, porque o *
também pode corresponder aos dígitos. Por exemplo, file58
corresponde a *<2-57>
, com file5
correspondendo à parte *
e 8
correspondendo à parte <2-57>
. O padrão *[^0-9]<2-57>
evita esse problema.