Tenha em atenção que -a
(implícito entre dois predicados, se omitido) tem precedência sobre -o
, pelo que é necessário utilizar parênteses:
find /folder ! -name .htaccess -type f \( \
! -user root -o ! -group test -o ! -perm 775 \)
Ou:
find /folder ! -name .htaccess -type f ! \( \
-user root -group test -perm 775 \)
Eu faço o -name
primeiro como uma otimização, pois ele não precisa fazer lstat()
no arquivo. Algumas implementações find
fazem essa otimização sozinhas (reordene a lista de predicados internamente).
Observe que -not
e -or
são extensões GNU não padrão. !
e -o
são o equivalente padrão.
Por causa das regras de precedência, o seu
find /folder -not -user root -or -not -group test -type f \(
! -iname ".htaccess" \) -or -not -perm 775
Na verdade, é interpretado como:
find /folder \( -not -user root \) -or \
\( -not -group test -a \
-type f -a \
\( ! -iname ".htaccess" \) \
\) -or \
\( -not -perm 775 \)