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

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

[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 , чтобы выполнить:

  • Почему `find` иногда находит мой файл, иногда не
  • Подсказывает ли ссылки ссылки на жесткие ссылки или символические ссылки?
  • Каковы проблемы безопасности и условия гонки при использовании `find -exec`?
  • Исключить все подкаталоги, кроме одного определенного пути в команде 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 

  • Как удалить сломанные символические ссылки за один раз?
  • Почему эти две команды find дают разные результаты?
  • Что такое «+» в команде find?
  • находить файлы без расширения
  • Почему «ls» не отображает обнаруженный файл?
  • POSIX находит все локальные файлы
  • 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 - лучшая ОС в мире.