如何通过 tar 提取正确的所有者权限?

How to extract correct owner permission by tar?

我想打包特定的一些子目录内容,并在原始权限下提取它们。在下面的示例中,它以错误的权限提取目录 a,我希望它与原始 foo 保持一致。怎么做?存档或提取时,我应该向 tar 添加什么参数?

创建测试样本文件:

foo ~/tmp $ mkdir -p a/b ; touch a/f1 a/b/f2

创建归档文件:

foo ~/tmp $ tar cf a.tar a/b

显示tar文件内容:

foo ~/tmp $ tar tvf a.tar
drwxr-xr-x foo/op           0 2018-05-11 10:33 a/b/
-rw-r--r-- foo/op           0 2018-05-11 10:33 a/b/f2

root 用户一起提取:

foo ~/tmp $ mkdir c
foo ~/tmp $ sudo tar -C c -xpf a.tar
foo ~/tmp $ find c -ls
  4743788      4 drwxr-xr-x   3  foo     op           4096 May 11 10:34 c
  4743789      4 drwxr-xr-x   3  root     root         4096 May 11 10:34 c/a
  4743790      4 drwxr-xr-x   2  foo     op           4096 May 11 10:33 c/a/b
  4727961      0 -rw-r--r--   1  foo     op              0 May 11 10:33 c/a/b/f2

我期待的是

  4743789      4 drwxr-xr-x   3  foo     op         4096 May 11 10:34 c/a

我认为这是正确的行为。您的 a.tar 不包含目录 c/a 因此必须在解包期间创建它。这是在您使用 - root.

解压存档的用户的上下文中完成的

tar 选项 -p 确实保留对目录的权限,但仅保留存档中的现有权限。

注意:我正在与用户 smalltalk.

一起解压

当您已经创建存档并想从已创建的存档中删除文件时的选项

我想你可以打包所有东西:

tar cf a.tar a

然后会产生

tar tvf a.tar 
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/f1

然后你可以简单地删除你不想要的 directories/files 在这种情况下 a/f1:

tar -vf a.tar --delete a/f1

您将获得:

tar tvf a.tar 
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2

因为现在目录 a/ 是打包文件的一部分,您在解包时将得到正确的结果:

find c -ls
149236    0 drwxrwxr-x   3 smalltalk smalltalk       14 May 11 10:14 c
17208669    0 drwxrwxr-x   3 smalltalk smalltalk       14 May 11 10:01 c/a
36340903    0 drwxrwxr-x   2 smalltalk smalltalk       15 May 11 10:01 c/a/b
36333667    0 -rw-rw-r--   1 smalltalk smalltalk        0 May 11 10:01 c/a/b/f2

第一次编辑 - 第二个选项 -- 打包前排除

就是先用--exclude选项创建一个没有目录的tar文件:

例如:

tar cf a.tar a --exclude=a/f1

这将创建:

tar tvf a.tar 
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2

然后提取的目录将具有正确的权限。

第二次编辑 - 添加最顶层目录

  • 基于评论(许多文件)- 在创建存档后添加目录

如果你有很多文件,我认为最好的解决方案是将目录添加到你已经创建的存档中。

然后您将按照您在问题中所做的那样创建文件:

tar cf a.tar a/b

然后您将添加顶级目录(--no-recursion 选项不包括子目录):

tar -rvf a.tar --no-recursion a/

然后您将获得包含添加目录的文件:

tar tvf a.tar 
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/b/
-rw-rw-r-- smalltalk/smalltalk 0 2018-05-11 10:01 a/b/f2
drwxrwxr-x smalltalk/smalltalk 0 2018-05-11 10:01 a/

然后你会得到正确的提取:

find c -ls
68333351    0 drwxrwxr-x   3 smalltalk smalltalk       14 May 11 11:01 c
87520961    0 drwxrwxr-x   3 smalltalk smalltalk       14 May 11 10:01 c/a
149236    0 drwxrwxr-x   2 smalltalk smalltalk       15 May 11 10:01 c/a/b
824154    0 -rw-rw-r--   1 smalltalk smalltalk        0 May 11 10:01 c/a/b/f2

分两步存档,第一步存档同上

tar cf a.tar a/b

第二步不递归追加目录

tar -rf a.tar --no-recursion a