具有多个条件的查找命令

具有多个条件的查找命令

我向您展示以下用例:

[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

答案1

请注意-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 \)

相关内容