Bash, ksh e zsh têm melhores soluções, mas nesta resposta eu assumo um shell POSIX.
O padrão .[!.]* corresponde a todos os arquivos que começam com um ponto seguido por um caractere sem ponto. (Observe que [^.] é suportado por alguns shells, mas não todos, a sintaxe portátil para o complemento de conjunto de caracteres em padrões curinga é [!.] .) Portanto, ele exclui . e .. , mas também arquivos que começam com dois pontos . O padrão ..?* manipula arquivos que começam com dois pontos e não são apenas .. .
chown -R root .[!.]* ..?*
Este é o conjunto de padrões clássicos para corresponder a todos os arquivos:
* .[!.]* ..?*
Uma limitação dessa abordagem é que, se um dos padrões não corresponder a nada, será passado para o comando. Em um script, quando você deseja corresponder todos os arquivos em um diretório, exceto . e .. , existem várias soluções, todas elas incômodas:
-
Use
* .*para enumerar todas as entradas e excluir.e..em um loop. Um ou ambos os padrões podem não corresponder a nada, portanto, o loop precisa verificar a existência de cada arquivo. Você tem a oportunidade de filtrar outros critérios; por exemplo, remova o teste-hse quiser pular links simbólicos pendentes.for x in * .*; do case $x in .|..) continue;; esac [ -e "$x" ] || [ -h "$x" ] || continue somecommand "$x" done -
Uma variante mais complexa em que o comando é executado apenas uma vez. Note que os parâmetros posicionais são burlados (os shells POSIX não possuem matrizes); coloque isso em uma função separada se isso for um problema.
set -- for x in * .[!.]* ..?*; do case $x in .|..) continue;; esac [ -e "$x" ] || [ -h "$x" ] || continue set -- "$@" "$x" done somecommand "$@" -
Use o tríptico
* .[!.]* ..?*. Novamente, um ou mais dos padrões podem não corresponder a nada, portanto, precisamos verificar os arquivos existentes (incluindo links simbólicos pendentes).for x in * .[!.]* ..?*; do [ -e "$x" ] || [ -h "$x" ] || continue somecommand "$x" done -
Use o
* .[!.]* ..?*tryptich e execute o comando uma vez por padrão, mas somente se ele corresponder a algo. Isso executa o comando apenas uma vez. Note que os parâmetros posicionais são burlados (as shells POSIX não possuem matrizes), coloque isso em uma função separada se isso for um problema.set -- * [ -e "$1" ] || [ -h "$1" ] || shift set -- .[!.]* "$@" [ -e "$1" ] || [ -h "$1" ] || shift set -- ..?* "$@" [ -e "$1" ] || [ -h "$1" ] || shift somecommand "$@" -
Use
find. Com o GNU ou o BSD, é fácil evitar a recursão com as opções-mindepthe-maxdepth. Com POSIX encontrar, é um pouco mais complicado, mas pode ser feito. Este formulário tem a vantagem de permitir facilmente executar o comando uma única vez, em vez de uma vez por arquivo (mas isso não é garantido: se o comando resultante for muito longo, o comando será executado em vários lotes).find . -name . -o -exec somecommand {} + -o -type d -prune