我向您展示以下用例:
[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 \)