将权限重置回默认值

将权限重置回默认值

如何根据掩码将权限重置为默认值,以便它们具有刚刚创建文件时设置的权限

我想要实现的示例: 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 umask0022您将得到755644)。

您可以用它创建一个通用函数:

#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

希望它对其他人有帮助!

相关内容