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