Isso ocorre porque as operações adjacentes vinculam-se a um -and
implícito que é o -or
explícito e porque, a partir da página find(1)
man, "se a expressão não contiver ações diferentes de -prune, -print será executada todos os arquivos para os quais a expressão é verdadeira. "
Isso significa que find
olha a expressão em seu primeiro exemplo e vê
(-not -user steven) -or (-not -group users)
e realiza -print
no resultado, como você esperava.
Find
vê seu segundo exemplo, no entanto,
(-not -user steven) -or ((-not -group users) -and -exec echo {})
Isso deve ecoar todos os arquivos pertencentes ao usuário steven e não pertencentes a usuários do grupo.
A solução é adicionar parênteses com escape em torno da sua expressão antes do -exec
:
sudo find . \( -not -user steven -or -not -group users \) -exec echo {} \;