O Bash não tem recursos para expandir apenas um jogo entre muitos.
O padrão @(foo) corresponde apenas a uma ocorrência do padrão foo . Ou seja, corresponde a foo , mas não a foofoo . Esse formulário sintático é útil para criar ou padrões como @(foo|bar) , que corresponde a foo ou bar . Pode ser usado como parte de padrões mais longos como @(foo|bar)-*.txt , que corresponde a foo-hello.txt , foo-42.txt , bar-42.txt , etc.
Se você quiser usar uma correspondência entre várias, poderá colocar as correspondências em uma matriz e usar um elemento da matriz.
kernels=(vmlinuz*)
ls -l "${kernels[0]}"
As correspondências são sempre classificadas em ordem lexicográfica, portanto, a primeira correspondência será impressa em ordem lexicográfica.
Observe que, se o padrão não corresponder a nenhum arquivo, você receberá uma matriz contendo um único elemento, que é o padrão inalterado:
$ a=(doesnotmatchanything*)
$ ls -l "${a[0]}"
ls: cannot access doesnotmatchanything*: No such file or directory
Defina a opção nullglob para obter uma matriz vazia.
shopt -s nullglob
kernels=(vmlinuz*)
if ((${#kernels[@]} == 0)); then
echo "No kernels here"
else
echo "One of the ${#kernels[@]} kernels is ${kernels[0]}"
fi
O Zsh tem recursos convenientes aqui. O qualificador de glob [NUM] faz com que o padrão seja expandido para apenas a NUMth correspondência; a variante [NUM1,NUM2] se expande para as correspondências NUM1th a NUM2th (começando em 1).
% ls -l vmlinuz*([1])
lrwxrwxrwx 1 root root 26 Nov 15 21:12 vmlinuz -> vmlinuz-3.16-0.bpo.3-amd64
% ls -l nosuchfilehere*([1])
zsh: no matches found: nosuchfilehere*([1])
O qualificador de glob N faz com que o padrão seja expandido para uma lista vazia se nenhum arquivo for correspondido.
kernels=(vmlinuz*(N))
if ((#kernels)); then
ls -l $kernels
else
echo "No kernels here"
fi
O qualificador de glob om classifica as correspondências aumentando a idade em vez de pelo nome ( m é para a hora da modificação); Om classifica diminuindo a idade. Então vmlinuz*(om[1]) expande para o arquivo de kernel mais recente.