negação extglob não funciona como esperado

2

Eu estava tentando usar a negação para excluir diretórios da globbing, mas os diretórios ainda aparecem na correspondência de padrões:

bash-4.3$ ls
file_1.txt  testdir
bash-4.3$ shopt extglob
extglob         on
bash-4.3$ echo !(*/)
file_1.txt testdir
bash-4.3$ 

O que exatamente estou fazendo errado?

Observação: sei que posso usar o comando for com [ ou find , mas estou tentando descobrir extglob especificamente.

    
por Sergiy Kolodyazhnyy 30.06.2017 / 06:44

1 resposta

4

Você não pode ter um / no @(...) , !(...) , *(...) ...

O / só pode aparecer entre globs, até a[x/y]b é tratado como @(a\[x)/@(y\]b) . Os globs são primeiro divididos em / e cada parte corresponde ao conteúdo de um diretório. Quando há x(...) ksh glob extensions, no entanto, não há divisão na / que está dentro da (...) , mas cada parte da glob ainda é comparada aos nomes dos arquivos. Em !(*/*) , */* é comparado com cada nome de arquivo no diretório atual. Obviamente, nenhum nome de arquivo pode conter um / , então não corresponde a nada, então !(*/*) corresponde a cada arquivo.

Aqui, você deseja usar zsh e seus qualificadores glob:

echo *(^/)

Para os arquivos de qualquer tipo, exceto o diretório. Ou para ser o oposto de bash */ (que é qualquer arquivo do tipo diretório após a resolução do link simbólico ):

echo *(-^/)

(arquivos que não são diretórios nem links simbólicos para diretórios).

    
por 30.06.2017 / 11:55