如何根据掩码将权限重置为默认值,以便他们将权限设置为刚刚创建的文件
我想要实现的示例:
umask
设置为 0022 所以
touch file
mkdir directory
Run Code Online (Sandbox Code Playgroud)
文件的权限现在是 rw-r--r--
目录的权限现在是 rwxr-xr-x
chmod 777 file
chmod 777 directory
Run Code Online (Sandbox Code Playgroud)
文件的权限现在是 rwxrwxrwx
目录的权限现在是 rwxrwxrwx
有没有办法将 perms 重置为默认值,以便文件rw-r--r--
和目录rwxr-xr-x
使用chmod
?
mur*_*uru 15
使用减法仅适用于某些 umask 值 - 最好使用,例如在 PSkocik 的答案中,或(或对于目录)应用标准指定的 umask,如 ilkkachu 在评论中所述。mode & ~umask
chmod =rw
chmod =rwx
在某些情况下,您只需减去文件和目录的umask
from即可获得默认权限:0666
0777
$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644
Run Code Online (Sandbox Code Playgroud)
因此,您可以申请chmod
:
chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory
Run Code Online (Sandbox Code Playgroud)
在 bash 中,您必须使用printf
以八进制强制输出:
$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建一个新文件和目录,并将它们用作参考:
touch file2
mkdir directory2
chmod --reference=directory2 directory
chmod --reference=file2 file
Run Code Online (Sandbox Code Playgroud)
掩码是通过掩码按位AND
应用的,bitwise negated
因此如果您想创建自己的最终权限模式,您可以执行以下操作:
$((mode & ~umask))
Run Code Online (Sandbox Code Playgroud)
您需要将其打印回八进制,以便您可以将其传递给chmod
:
$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files
Run Code Online (Sandbox Code Playgroud)
其中 0777 是您要应用掩码的权限模式(您可以使用stat -c %a file
或获得它stat -c %a directory
)。
您可以回显上述内容以查看进程替换将评估的结果(对于umask
of 0022
,您将获得755
and 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
}
Run Code Online (Sandbox Code Playgroud)
对于您的特定用途,chmod 参考文件是另一种选择。
归档时间: |
|
查看次数: |
55113 次 |
最近记录: |