Concordo com o comentário sobre a opção dotglob
shell.
Se não estiver definido, o comportamento do loop for é o esperado:
utente@computer:/tmp/test$ shopt | grep dotglob
dotglob off
Deixe a
, b
e c
serem arquivos normais; .hidden1
e .hidden2
arquivos ocultos:
utente@computer:/tmp/test$ touch a b c .hidden1 .hidden2
utente@computer:/tmp/test$ ls -al
totale 8
drwxrwxr-x 2 utente utente 4096 giu 10 18:28 .
drwxrwxrwt 13 root root 4096 giu 10 18:28 ..
-rw-rw-r-- 1 utente utente 0 giu 10 18:28 a
-rw-rw-r-- 1 utente utente 0 giu 10 18:28 b
-rw-rw-r-- 1 utente utente 0 giu 10 18:28 c
-rw-rw-r-- 1 utente utente 0 giu 10 18:28 .hidden1
-rw-rw-r-- 1 utente utente 0 giu 10 18:28 .hidden2
Para loop:
utente@computer:/tmp/test$ for eachfile in * ; do ls $eachfile ; done
a
b
c
Outra maneira, independente das opções de shell: vamos instruir find
para filtrar todos os nomes de caminho cujos caracteres iniciais correspondem ao ponto .
:
utente@computer:/tmp/test$ find . \( ! -path '*/.*' \) -type f -exec ls {} \;
./c
./b
./a
Veja também esta pergunta em superuser.com