如何用find命令通过文件权限排除Untitled.rtf文件?
问题:使用find命令排除特定权限的文件
我想用find命令筛选文件,现在需要排除权限为-rwxr-xr-x@的“Untitled.rtf”文件。我已经能通过命令找到这个文件,但用!(NOT)和-a(AND)组合的find命令没能成功排除它,求正确命令。
文件权限列表
-rwxr-xr-x@ 1 X staff 368 Jan 24 03:02 Untitled.rtf* -rw------- 1 X staff 0 Jan 24 02:37 t -r-------- 1 X staff 0 Jan 24 02:40 t2 drwx------ 2 X staff 64 Jan 24 02:52 t3/
已成功找到目标文件的命令
$ find . \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) -exec ls -l {} \; -rwxr-xr-x@ 1 X staff 368 Jan 24 03:02 ./Untitled.rtf
尝试但未成功的排除命令
$ find . \( -perm -000 -a ! \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) \) -exec ls -l {} \; -rwxr-xr-x@ 1 X staff 368 Jan 24 03:02 Untitled.rtf -rw------- 1 X staff 0 Jan 24 02:37 t -r-------- 1 X staff 0 Jan 24 02:40 t2 drwx------ 2 X staff 64 Jan 24 02:52 t3 -r-------- 1 X staff 0 Jan 24 02:40 ./t2 -rw------- 1 X staff 0 Jan 24 02:37 ./t
正确命令及解释
你之前的排除命令逻辑出错了:-perm -000是找所有权限位都未设置的文件,这和你的需求完全不匹配,而且逻辑组合也不对。要排除“组或其他用户有任何读/写/执行权限”的文件,也就是保留组和其他用户都没有任何权限的文件,有两种可行的写法:
写法一:直接取反匹配条件
find . ! \( -perm -g+r -o -perm -g+w -o -perm -g+x -o -perm -o+r -o -perm -o+w -o -perm -o+x \) -exec ls -l {} \;
这个命令直接对之前找到目标文件的条件取反,就能排除所有符合该条件的文件(也就是Untitled.rtf),剩下的就是你需要保留的文件。
写法二:精准指定权限掩码
因为你要保留的是普通文件权限为600(-rw-------)、目录权限为700(drwx------)的文件,可以直接指定类型和权限,效率更高:
find . \( -type f -perm 600 \) -o \( -type d -perm 700 \) -exec ls -l {} \;
执行这两个命令后,输出都只会包含t、t2、t3,不会出现Untitled.rtf。
内容的提问来源于stack exchange,提问作者notaorb
相关产品推荐
相关产品推荐

