Localizar comando com várias condições

1

Eu apresento-lhe o seguinte caso de uso:

[root@localCentOS71 folder]# ls -lah
total 16K
drwxr-xr-x 3 root root  4.0K Dec 22 08:52 .
drwxr-xr-x 4 root root  4.0K Dec 21 14:59 ..
-rw-r--r-- 1 root test     0 Dec 22 08:52 file
drwxr-xr-x 2 root root  4.0K Dec 21 14:59 hi
-rw-r--r-- 1 root root     0 Dec 22 08:46 .htaccess
-rw-r--r-- 1 root root   175 Dec 22 08:47 test

Estou tentando invocar um comando find para executar:

  • Encontrar somente arquivos regulares
  • Encontre onde o proprietário não é root ou
  • Encontre onde o grupo não é raiz ou
  • Encontre onde as permissões não são 775 e
  • Excluir arquivos .htaccess

Comando atual:

find /folder -not -user root -or -not -group test -type f \( ! -iname ".htaccess" \) -or -not -perm 775

Saída desejada:

/folder/test
/folder/file

Saída real:

/folder
/folder/.htaccess
/folder/hi
/folder/test
/folder/file
    
por Kevin 22.12.2016 / 10:15

1 resposta

3

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 \)
    
por 22.12.2016 / 10:23

Tags