[...]
corresponde a um caractere ( elemento de agrupamento em alguns shells) se estiver no conjunto especificado.
[10-12]
significa o caractere 1
ou caracteres de 0
a 1
ou caractere 2
, portanto, o mesmo que [102]
ou [0-2]
.
[10,11,12]
significa 1
, 0
, ,
, 1
... Então, o mesmo que [,0-2]
.
Aqui você quer:
ls -d -- *1[0-2]
Ou seja, nomes de arquivo (não ocultos) que terminam em 1 seguidos por qualquer um dos caracteres 0
, 1
ou 2
.
Agora, tenha em atenção que também corresponde a foo110
ou foo112345612
.
Se você não quiser isso, precisará de algo como:
ls -d -- *[!0-9]1[0-2] 1[0-2]
Isso, no entanto, não corresponderia a foo010
Se estiver fora de foo10
, foo00010
, foo110
você deseja que foo10
e foo00010
correspondam, então com ksh
ou bash -O extglob
ou zsh -o kshglob
:
ls -d -- !(*[0-9])*(0)1[0-2]
Observe que, exceto com zsh
, se algum desses padrões não corresponder, os padrões serão passados como estão para ls
, portanto, você pode acabar listando arquivos indesejados se houver arquivos com nomes como esse. Com bash
, você pode definir a opção failglob
para contornar isso.
zsh
é o único shell que tem um operador glob para corresponder a intervalos de números.
ls -d -- *<10-12>
corresponderia os arquivos que terminam em um número de 10 a 12. Ele também corresponderia a foo110
, já que é foo1
seguido por 10
. Você poderia fazer (com extendedglob
):
ls -d -- (^*[0-9])<10-12>
embora.
zsh
é também o shell que introduziu o tipo {10..12}
da expansão da chave (copiada por ksh93 e bash alguns anos depois).
No entanto, como o {10,11,12}
equivalente, isso é não globbing. Essa é uma forma de expansão que é feita antes de globbing.
ls -d -- *{10..12}
é expandido primeiro para:
ls -d -- *10 *11 *12
Se algum desses 3 globs falhar, o comando será cancelado em zsh
(e bash -O failglob
).