避免由于tar无法恢复目录权限而导致的错误


13

我发现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创建时而不是提取时执行此操作。
Roy Truelove

Answers:


22

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

1
也适用于我的案例,在该案例中,我将tar归档文件提取到已安装的Samba共享中。请注意,与命令所建议的不同,它也可以在目标为空白时抑制错误(即,所有会出错的目录均由tar本身创建)。再次感谢!
user149408 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.