O caractere .
só é excluído da correspondência de curinga quando é o primeiro caractere do nome do arquivo e seria correspondido por um curinga. No padrão .*
, o *
corresponde cadeias começando com .
, portanto .*
inclui ..
(bem como .
, com *
correspondendo à cadeia vazia). Esta é uma consequência direta das regras de correspondência de padrões, por mais irritantes que possam ser.
Faz sentido abrir uma exceção e excluir sistematicamente .
e ..
das correspondências, mas não foi assim que foi feito historicamente, portanto, muitos shells Bourne / POSIX ( sh
, dash
, bash
, AT & T ksh
, yash
…) inclui-os, assim como (t) csh e até mesmo peixe 1.x. Alguns shells excluem .
e ..
de todas as correspondências com curingas: zsh, pdksh / posh / mksh (diferente de AT & T ksh), fish ≥2.0 .
Se você definir GLOBIGNORE
para qualquer valor não vazio, bash alternará para o comportamento conveniente, mas não padrão, de excluir .
e ..
das correspondências. A configuração GLOBIGNORE
também desativa o comportamento de excluir arquivos de ponto; com GLOBIGNORE='.*'
, você obtém o comportamento normal de ./*
, excluindo os arquivos de pontos, mas ./.*
corresponde apenas aos arquivos de ponto e não .
ou ..
. Defina GLOBIGNORE=.:..
(ou GLOBIGNORE=.
) para que ./*
correspondam a todos os arquivos, incluindo arquivos de ponto, mas excluindo .
e ..
.
Em ksh93, defina FIGNORE='@(.|..)'
para excluir .
e ..
das correspondências, mas inclua arquivos de ponto. Assim, .*
expandirá para arquivos de pontos, mas não incluirá .
ou ..
.
Sem recorrer a funcionalidades específicas da shell, pode combinar ficheiros dot com as duas globs seguintes:
.[!.]* ..?*
e todos os arquivos (excluindo .
e ..
) com os seguintes três globs:
..?* .[!.]* *
Mas você precisa tomar cuidado porque um ou vários globs podem não corresponder a nenhum arquivo, o que faria com que o padrão correspondente permanecesse não expandido.
Para evitar surpresas, pode ser mais fácil usar find
. find
nunca recorre ao diretório pai (a menos que seja instruído a seguir links simbólicos).
find /home/username/. -name . -o -prune -name '.*' -exec chown -R username:groupname {} +