如何根据掩码将权限重置为默认值,以便它们具有刚刚创建文件时设置的权限
我想要实现的示例:
umask
设置为 0022 所以
touch file
mkdir directory
文件的权限现在是rw-r--r--
目录的权限现在是rwxr-xr-x
chmod 777 file
chmod 777 directory
文件的权限现在是rwxrwxrwx
现在目录的权限是rwxrwxrwx
有没有办法将权限重置回默认值,以便文件rw-r--r--
和目录rwxr-xr-x
使用chmod
?
答案1
使用减法仅对某些 umask 值正确 - 最好使用,例如mode & ~umask
在 PSkocik 的回答中,或chmod =rw
(或chmod =rwx
对于目录)应用标准指定的 umask,正如 ilkkachu 在评论中指出的。
umask
在某些情况下,您只需从0666
文件和目录中减去即可0777
获得默认权限:
$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644
因此,您可以申请chmod
:
chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory
在 bash 中,您必须使用printf
强制八进制输出:
$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755
另一种方法是创建一个新文件和目录,并将它们用作参考:
touch file2
mkdir directory2
chmod --reference=directory2 directory
chmod --reference=file2 file
答案2
掩码通过掩码AND
按位应用bitwise negated
,因此如果您想创建自己的最终权限模式,您可以执行以下操作:
$((mode & ~umask))
您需要将其以八进制打印回来,以便可以将其传递给chmod
:
$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files
其中 0777 是您想要应用掩码的权限模式(您可以使用stat -c %a file
或获取它stat -c %a directory
)。
您可以回显上面的内容以查看进程替换的计算结果(对于 of umask
,0022
您将得到755
和644
)。
您可以用它创建一个通用函数:
#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
local mask="$1" dmask mode a
dmask="$((mask & ~0111))"; shift
for a; do
mode=0`stat -c "%a" "$a"`
chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
done
}
对于您的特定用途,chmod 参考文件是另一种选择。
答案3
如果你想通过当前目录递归地执行它 -
chmod -R $((777 - `umask`)) .
chmod -R -x+X .
您可以替换`umask`
为$(umask)
.
答案4
递归文件和目录
对于任何希望在父目录中递归重置所有文件和目录的人:
sudo find . -type f -print0 | xargs -0 sudo chmod $((0666 - $(umask)))
sudo find . -type d -print0 | xargs -0 sudo chmod $((0777 - $(umask)))
解释
其他答案展示了如何分别使用 和 重置单个文件和目录(或递归地将一个规则应用于两者chmod -R $((0666 - $(umask)))
)chmod -R $((0777 - $(umask)))
。 (很好的答案,谢谢!)
然后我发现这个答案展示如何使用 find 在整个目录中选择性地应用权限:
find . -type f -print0 | xargs -0 chmod 644
这将递归地更改文件,因此
find . -type d -print0 | xargs -0 chmod 755
将应用于目录。
将这些答案串在一起提供了上述解决方案。请注意,这分别需要/选项的 GNU 版本find
和。xargs
-print0
-0
希望它对其他人有帮助!