Найти команду с несколькими условиями

Представляю вам следующий прецедент:

[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 

Я пытаюсь вызвать команду find , чтобы выполнить:

  • Найти только обычные файлы
  • Найдите, где владелец не является root или
  • Найдите, где группа не является root или
  • Найдите, где разрешений не 775, а
  • Исключить файлы .htaccess

Текущая команда:

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

Желаемый результат:

 /folder/test /folder/file 

Фактический выход:

 /folder /folder/.htaccess /folder/hi /folder/test /folder/file 

  • Определите подкаталоги, которые не содержат определенную строку в определенном файле
  • Как найти / перечислить все файлы в файловой системе с определенным SELinux «fcontext»
  • как найти файлы на основе диапазона имен файлов?
  • Почему я не могу chmod эти файлы, которые я мог ранее?
  • GUI для поиска, который может показывать миниатюры видео
  • Как использовать команду find в Perl-скрипте?
  • Найти и переместить с исключением
  • Может кто-нибудь объяснить, что делает эта команда?
  • One Solution collect form web for “Найти команду с несколькими условиями”

    Остерегайтесь того, что -a (неявное между двумя предикатами, если оммитировано) имеет приоритет над -o , поэтому вам нужно использовать круглые скобки:

     find /folder ! -name .htaccess -type f \( \ ! -user root -o ! -group test -o ! -perm 775 \) 

    Или:

     find /folder ! -name .htaccess -type f ! \( \ -user root -group test -perm 775 \) 

    Сначала я делаю имя -name как оптимизацию, так как ему не нужно делать lstat() в файле. Некоторые find реализации сами делают эту оптимизацию (переупорядочивают список предикатов внутри).

    Обратите внимание, что -not и -or нестандартные расширения GNU. ! и -o – стандартный эквивалент.

    Из-за правил приоритета ваш

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

    Фактически интерпретируется как:

     find /folder \( -not -user root \) -or \ \( -not -group test -a \ -type f -a \ \( ! -iname ".htaccess" \) \ \) -or \ \( -not -perm 775 \) 
    Linux и Unix - лучшая ОС в мире.