【问题标题】:How to extract correct owner permission by tar?如何通过tar提取正确的所有者权限?
【发布时间】:2018-10-21 14:13:24
【问题描述】:

我想打包特定的一些子目录内容,并以原始权限提取它们。在下面的示例中,它以错误的权限提取目录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

【问题讨论】:

    标签: file-permissions tar


    【解决方案1】:

    将归档分为两步,第一步归档同上

    tar cf a.tar a/b
    

    第二步不递归追加目录

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

    【讨论】:

      【解决方案2】:

      我认为这是正确的行为。您的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
      

      然后你可以简单地删除在这种情况下你不想要的目录/文件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
      

      First Edit - Second option -- 打包前排除

      首先使用--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
      

      【讨论】:

      • 这个解决方案似乎需要更多额外的工作来指定所有排除文件。我只是简化了我的例子,实际上有很多目录和文件。
      • @DanielYCLin 我明白了,我会用我认为最好的解决方案来编辑​​我的答案。
      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2020-07-10
      • 1970-01-01
      • 2022-01-20
      • 2010-11-23
      相关资源
      最近更新 更多