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