É porque *
não corresponde aos arquivos que começam com .
por padrão. Considere o seguinte diretório:
$ ls -la
total 8404
drwxrwxrwx 2 terdon terdon 8105984 Dec 31 13:14 .
drwxr-xr-x 153 terdon terdon 491520 Dec 30 22:32 ..
-rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 .dotfile
-rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file1
-rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file2
-rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file3.
Vamos ver o que cada um dos globs que você usou se expande para:
$ echo .*
. .. .dotfile
$ echo *.
file3.
$ echo *
file1 file2 file3.
Como você pode ver, o *
não inclui arquivos ou diretórios que começam com .
, portanto, ./
e ../
são ignorados. A mesma coisa acontece com o seu ls
exemplo. Em bash
, você pode alterar isso com o parâmetro dotglob
:
$ shopt -s dotglob
$ echo .*
. .. .dotfile
Outras camadas se comportam de maneira diferente, por exemplo csh
:
% echo .*
. .. .dotfile