De acordo com man find , a justaposição (que é um operador "e" implícito) tem precedência sobre o -or operator, então pode-se esperar que os argumentos sejam avaliados da seguinte forma:
( -name '.amandahosts' -or -uid 11 ) e ( -exec ls -ld {} + )
De fato, se eu adicionar os parentes ao comando find, ele funcionará como esperado:
[pitserver ~]% sudo find /home/pitserver/operator '(' -name '.amandahosts' -or -uid 11 ')' -exec ls -nld {} +
drwxr-xr-x 2 11 28 4096 Jan 30 2006 /home/pitserver/operator
-rw------- 1 11 28 32 Oct 3 2005 /home/pitserver/operator/.amandahosts
-rw------- 1 11 28 700 Jan 30 2006 /home/pitserver/operator/.viminfo
-rw------- 1 11 28 65 Jan 30 2006 /home/pitserver/operator/.Xauthority
No entanto, encontrar realmente interpreta os argumentos como este:
( -name '.amandahosts' ) ou ( -uid 11 -exec ls -ld {} + )
Como você pode ver aqui:
[pitserver ~]% sudo find /home/pitserver/operator -name '.amandahosts' -or '(' -uid 11 -exec ls -nld {} + ')'
drwxr-xr-x 2 11 28 4096 Jan 30 2006 /home/pitserver/operator
-rw------- 1 11 28 700 Jan 30 2006 /home/pitserver/operator/.viminfo
-rw------- 1 11 28 65 Jan 30 2006 /home/pitserver/operator/.Xauthority
O que está acontecendo aqui é que o "ou" está em curto-circuito. A segunda parte do '-ou' ( -uid 11 -exec ls -ld {} + ) é avaliada somente se a primeira parte ( -name '.amandahosts' ) for avaliada como false . Portanto, o arquivo somente será executado -exec ... se o arquivo não for denominado '.amandahosts' . Uma maneira de ver como isso funciona é observar que os itens a seguir são bem-sucedidos:
[pitserver ~]% sudo find /home/pitserver/operator -name '.amandahosts' -exec ls -nld {} + -or -uid 11 -exec ls -nld {} +
-rw------- 1 11 28 32 Oct 3 2005 /home/pitserver/operator/.amandahosts
drwxr-xr-x 2 11 28 4096 Jan 30 2006 /home/pitserver/operator
-rw------- 1 11 28 700 Jan 30 2006 /home/pitserver/operator/.viminfo
-rw------- 1 11 28 65 Jan 30 2006 /home/pitserver/operator/.Xauthority
A melhor maneira de resolver esse problema parece ser usar sempre parens ao usar um operador "ou", pois isso fornece exatamente o comportamento desejado:
'(' -name '.amandahosts' -or -uid 11 ')' -exec ls -nld {} +