我有一个 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"
umask
POSIX 并未指定 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))")