查找具有不同 umask 的文件和目录

查找具有不同 umask 的文件和目录

我有一个 umask 作为0002使用umask -S它的返回u=rwx,g=rwx,o=rx

如何找到所有没有根据掩码设置权限的文件和目录?

目录777 - mask 和文件666 - mask 如果我做类似的事情

find . ! -perm $(umask -S) 

它将找到所有未设置权限的文件/目录u=rwx,g=rwx,o=rx( 777 - 002 是权限,但 666 - 002 是不同的权限),这对目录有用,但不适用于文件。

如何查找与当前设置的 umask 具有不同权限的文件?

例子

 touch one
 ls -l
 -rw-rw-r-- 1 trolkura trolkura 0 kvě  4 09:01 one

umask 是 0002 所以这会导致664,但是当我这样做时

find . -type f ! -perm $(umask -S)
./one

结果显示新创建的文件,因为它正在查找没有775权限(目录权限)的文件。

答案1

你为什么不尝试一下这个:

寻找 。 -用户trolkura! -perm -u+rw

这意味着:查找从当前目录开始、由 trolkura 拥有的文件,其中组和其他的权限可以是任何内容(- 在权限字符串前面),并且用户权限仅为:rw

答案2

您可以使用八进制形式并手动进行计算。使用 POSIX shell:

dir_perms=$(printf '%#o' "$((0777 - $(umask)))")
non_dir_perms=$(printf '%#o' "$((dir_perms & 0666))")
find . -type d ! -perms "$dir_perms" -o ! -type d ! -perms "$non_dir_perms"

umaskPOSIX 并未指定 alone的输出格式,但实际上,对于所有 shell,它都是一个至少有一个前导 0 的八进制数。

zsh默认情况下,不将前导 0 的数字视为八进制。在 中zsh,您可以sh在本地上下文中启用模拟((){ emulate -L sh; ....}(emulate sh; ...)或只是set -o octalzeroes)或使用:

dir_perms=0$(([##8] 8#777 - 8#$(umask)))
non_dir_perms=0$(([##8] 8#$dir_perms & 8#666))

默认情况下mksh也不会将前导 0 的数字视为八进制,您可以使用set -o posix或执行以下操作:

dir_perms=$(printf '%#o' "$((8#777 - 8#$(umask)))")
non_dir_perms=$(printf '%#o' "$((8#$dir_perms & 8#666))")

相关内容