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).