ll -d -- !(.*{ry,rc})
combina expansão globbing e cinta. Primeiro é expandido para:
ll -d -- !(.*ry) !(.*rc)
E as globs se expandiram individualmente. E o primeiro corresponde a .inputrc
(em bash -O extglob
mas não em ksh
de onde essa sintaxe vem nem zsh
em ksh
emulação, pois são arquivos ocultos e arquivos de ponto não são explicitamente solicitados).
Você pode verificar isso em um diretório em que esses globs não correspondam a nenhum arquivo (caso em que os globs são deixados intactos, outro bash
pode apresentar uma funcionalidade que você pode contornar com shopt -s failglob
) em um diretório onde você não tem permissão de leitura:
$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)
Enquanto em
ll -d -- !(.*@(ry|rc))
Isso é um glob.
Aqui, você também pode fazer:
ll -d -- !(.*r[cy])
Ou:
ll -d -- !(.*rc|.*ry)
Observe que bash
também inclui .
e ..
nessa expansão. Se você quisesse excluí-los (como eu tenho certeza que você faria), mas ainda incluir arquivos ocultos, você precisaria:
shopt -s dotglob
ll -d -- !([.]*@(rc|ry))
Ou você pode excluí-los explicitamente:
ll -d -- !(.*@(rc|ry)|.|..)
Em zsh -o extendedglob
, gostaria de fazer:
ll -d -- ^.*(rc|ry)(D)
(onde (D)
ativa dotglob
somente para esse glob).