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

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

[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 

  • Как найти файлы в формате PDF, созданные LaTeX?
  • Проблема, когда я пытаюсь передать параметры, чтобы найти команду?
  • Почему `find -name * .jks` не возвращает некоторые файлы?
  • chmod - Что делает эта команда?
  • find: значение \? знак как значение параметра имени
  • Как я могу прокручивать строки файла и находить файлы, соответствующие каждой строке?
  • find: ничего не делать, если файлы не указаны
  • Как найти каталоги, в которых ни один из файлов внутри не был доступен через год?
  • 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 \) 
    Interesting Posts

    Как включить Shift Lock? (Sticky shift key)

    В Vim, как я могу удалить весь текст из текущей позиции курсора до следующего пробела?

    подстановка команды bash с перенаправлением: дескриптор файла

    Как я могу узнать, какие флаги компоновщика необходимы для использования данной функции библиотеки C?

    Удалите определенную часть строки

    Метод поиска каталога GNU texinfo?

    Почему мой пользовательский логин вызывает systemd для использования процессора?

    Mouting образ диска qvm qmu с несколькими разделами

    Как найти сходство по оси ординат в двух картинках?

    Удалите пробелы перед определенными символами

    Как иметь очередь процессов в AIX, например, xargs с «–max-procs»?

    SSMTP ERROR: НЕ МОЖЕТ ОТКРЫТЬ SMTP.GMAIL.COM:587

    Как ограничить доступную виртуальную память на каждый процесс

    Автозапуск OpenVPN с systemd

    Как прочитать вывод `dmesg`, чтобы определить, сколько памяти используется процессом при вызове oom-killer?

    Linux и Unix - лучшая ОС в мире.