从man 1 tar
:
[...]
-p, --preserve-permissions, --same-permissions
extract information about file permissions (default for superuser)
[...]
--no-same-permissions
apply the user's umask when extracting permissions from the archive
(default for ordinary users)
[...]
从中我了解到,默认情况下,提取的文件的权限是根据用户的 umask 设置的,除非用户是 root:
% umask
002
所以我提取的文件应该具有权限664
(666
- 002
)。
然而:
% touch foo
% chmod +x foo
% ls -l
total 0
-rwxrwxr-x 1 user user 0 nov 3 19:36 foo
% tar cf foo.tar foo
% rm foo
% tar xf foo.tar
% ls -l
total 12
-rwxrwxr-x 1 user user 0 nov 3 19:36 foo
-rw-rw-r-- 1 user user 10240 nov 3 19:36 foo.tar
即,即使我没有传递-p
,--preserve-permissions
或--same-permissions
开关,Tar 仍保留原始文件的权限。
尽管如此,如果我通过了--no-same-permissions
开关:
% tar xf foo.tar --no-same-permissions
% ls -l
total 12
-rwxrwxr-x 1 user user 0 nov 3 19:36 foo
-rw-rw-r-- 1 user user 10240 nov 3 19:36 foo.tar
Tar 仍保留原始文件的权限。
有人能解释一下为什么吗?
答案1
由于 adonis(发现问题的人)尚未发表答案,因此我将自己发表一个答案。
[...]
--no-same-permissions
apply the user's umask when extracting permissions from the archive
(default for ordinary users)
[...]
这与我的想法相反,这意味着 umask 应用于存档中的文件夹/文件的权限,而不是像我认为的那样应用于新创建的文件夹/文件(777
/ 666
)的常规权限。
即提取文件夹/文件而不传递-p
,--preserve-permissions
或--same-permissions
开关惯于将权限设置为777 & ~umask
/ 666 & ~umask
,但设置为folder's/file's_archived_permissions & ~umask
。
在这个特定的例子中,我还被这样一个事实所欺骗:将 umask 应用于002
具有权限的文件775
不会改变任何东西,因为775 & ~002 = 775
。
因此,简而言之,775
使用用户 umask 的权限提取文件002
,可以正确地生成具有权限的文件775
,结果为775 & ~002
。