Todas as respostas até agora são baseadas no fato de que os arquivos (ou diretórios) cujos nomes começam com um ponto estão "ocultos". Eu criei outra solução, que pode não ser tão eficiente, mas essa solução não pressupõe nada sobre os nomes dos arquivos ocultos e, portanto, evita listar ..
no resultado (assim como a resposta aceita atualmente).
O comando completo é:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Explicação
O que isto faz é listar todos os arquivos (e diretórios) duas vezes,
echo -e "$(\ls)\n$(\ls -A)"
mas mostrando apenas arquivos ocultos uma vez -A
.
Em seguida, a lista é classificada em | sort
, o que torna os arquivos regulares (não exibidos) exibidos duas vezes e próximos uns dos outros.
Em seguida, remova todas as linhas que aparecem mais de uma vez | uniq -u
, deixando apenas linhas exclusivas.
Finalmente, use ls
novamente para listar todos os arquivos com as opções personalizadas do usuário e sem listar o conteúdo dos diretórios na lista -d
.
EDIT (Limitações):
Como observou a muru, essa solução não funcionará corretamente se houver arquivos com nomes como escaped\ncharacter.txt
porque echo -e
dividirá o nome do arquivo em duas linhas. Ele também não funcionará como esperado se houver dois arquivos ocultos com quase o mesmo nome, exceto por um caractere especial, como .foo[tab].txt
e .foo[new-line].txt
, pois ambos são impressos como .foo?.txt
e seriam eliminados por uniq -u