Remova a solução:
ls -pd !(*.jpg) | grep -Ev /$
Detalhes
Seu padrão glob não desce em subdiretórios. ls
faz: se você passar um diretório em sua linha de comando, ele exibe o conteúdo desse diretório.
Substitua ls
por echo
:
$ echo !(*.jpg)
Ou, uma solução (quase) equivalente: diga ls
para não entrar nos diretórios.
$ ls -d !(*.jpg)
Para responder a pergunta nos comentários: "como usar o comando ls para listar apenas arquivos e não pastas?" Existem algumas opções:
O caminho curto para listar apenas diretórios é:
echo */
Então, talvez, a resposta para listar apenas arquivos e não diretórios pode usar um grep -v
$ ls -p | grep -Ev /$
$ find . -maxdepth 1 ! -type d
Observe que o find listará os arquivos de pontos (arquivos ocultos). E find . -type d
(também) não segue links simbólicos.
Ou o loop pragmático (posix):
$ for f in * ; do if [ -f "$f" ] ; then echo "$f" ; fi ; done
É claro que a solução específica para uma expansão negada deve ser assim:
$ ls -pd !(*.jpg) | grep -Ev /$
11
111
112
1121
113
11a
11a1
1a1
1a2
1aa1.png
2a1
a.
a1a
a2a
aa
aa.gif
aa.png
aa.tiff
a.exe
a.gif
a.html
a.png
a.tiff
b2
b2a
ba.gif
ba.png
ba.tiff
b.html
cb1.png
d.gif
Nota:
A opção -p junto com o grep faz o truque para identificar os diretórios, dê uma olhada na página do manual ls:
-p, --file-type, --indicator-style=file-type