Sua expressão regular não funciona porque . não é um caractere de palavra. O grep considera apenas a-z , A-Z , 0-9 e _ como caracteres de palavras.
De qualquer forma, essa não é a maneira correta de fazer isso. Primeiro de tudo, analisar ls é muito frágil e quase nunca é uma boa ideia. Aqui estão algumas outras maneiras de listar diretórios cujo nome começa com . :
find . -type d -name '.*'
Ou, se você não quiser que ele desça em subdiretórios (e se você tiver o GNU find , o padrão no Linux):
find . -maxdepth 1 -type d -name '.*'
Como alternativa, você pode usar apenas echo e um shell glob:
echo .*
Isso também mostrará arquivos. Para evitar isso, use um loop como:
for i in .*; do [ -d "$i" ] && printf '%s\n' "$i"; done