我观察到 tar 1.26 和 1.27.1 均出现以下行为:
$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b -xvf test.tar diffowner
diffowner/
diffowner/foo
tar: diffowner: Cannot utime: Operation not permitted
tar: diffowner: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors
因此,我在这里尝试将 tar 文件提取到现有目录结构中,其中我不是所有相关目录的所有者,但我对所有目录都有写入权限。事实上,它们是在一个组之间共享的。
我不在乎时间戳,我相信权限应该已经正确了。我以普通用户的身份运行它,所以--preserve-permissions
除非得到指示,否则它不应该尝试这样做,而我没有这样做。真正让我担心的是退出状态:我打算在脚本中使用它,并想知道实际提取是否正常。
tar 中是否有一个选项可以告诉它不是既不立即也不延迟地设置目录权限?如果做不到这一点,您建议其他什么解决方案。现在我正在考虑提取到临时目录,然后使用它rsync
来将内容移动到现有树中。但也许您知道一种不那么黑客的方法。
答案1
这个tar
选项可能就是你正在寻找的:
--no-overwrite-dir
preserve metadata of existing directories
我测试如下:
$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b --no-overwrite-dir -xvf test.tar diffowner
diffowner/
diffowner/foo
$ echo $?
0