A solução é ligar os dois testes de nomes com os parêntesis.
Para ilustrar isso, vamos considerar um diretório com três arquivos regulares:
$ ls -a
. .. .hidden1 .hidden2 not_hidden
Agora, vamos ao comando original:
$ find . -name ".*" -o -name "*" -exec echo Found {} \;
Found ./not_hidden
Apenas o arquivo não oculto é encontrado.
Em seguida, vamos adicionar parentes para agrupar os dois testes de nomes:
$ find . \( -name ".*" -o -name "*" \) -exec echo Found {} \;
Found .
Found ./not_hidden
Found ./.hidden1
Found ./.hidden2
Todos os arquivos são encontrados.
A solução é usar parênteses.
Mais detalhes
No comando original, não há operador entre -name "*"
e -exec ... \;
. Conseqüentemente, find
assume o operador padrão que é lógico-e. Porque lógico-e liga-se mais apertado do que lógico-ou ( -o
), isso significa que o comando é interpretado como:
find . \( -name ".*" \) -o \( -name "*" -exec echo Found {} \; \)
Isso significa que o exec
é executado apenas se a primeira condição name
não corresponder.
Para mais informações, consulte a seção OPERADORES em man find
.
O que acontece sem -exec
Vamos tentar usar um simples -print
:
$ find . -name ".*" -o -name "*" -print
./not_hidden
Como você pode ver, -print
está vinculado ao -name "*"
com o lógico implícito e como acima.
Mas, considere o que acontece sem qualquer ação especificada:
$ find . -name ".*" -o -name "*"
.
./not_hidden
./.hidden1
./.hidden2
Aqui, todos os arquivos foram encontrados. A razão é que, nesta versão, -o
é o operador somente .