我在 Debian Sid 上使用 GNU tar,我想备份系统目录
root@debian:/usr# ( cd /usr ; tar cf - ./share ) | ( cd /home ; tar xf - )
但一些解压到的目录/home
具有不同的权限,例如,
$ ls -ld /{home,usr}/share/{wallpapers,xindy}
drwx------ 4 root root 4096 Oct 1 00:22 /home/share/wallpapers/
drwxr-xr-x 9 root root 4096 May 16 2016 /home/share/xindy/
drwxr-xr-x 4 root root 4096 Sep 30 19:45 /usr/share/wallpapers/
drwxr-xr-x 9 root root 4096 May 16 2016 /usr/share/xindy/
$
我的错误是什么?
答案1
意外的权限和日期/home/share/wallpapers/
是因为命令仍在运行。
Imaginetar
被普通用户用来提取r-xr-xr-x
具有权限的目录(由用户拥有)和其中的一些文件。如果tar
在提取文件之前应用了这些权限,则无法继续处理这些文件。为了解决这个问题,该工具首先授予自己写访问权限 ( rwxr-xr-x
),然后恢复文件,然后才将权限更改为应有的权限。
tar
以 root 身份提取的过程略有不同。它创建的目录最初属于 ,root:root
但不具有组或其他用户的任何访问权限。只有在处理完其中的所有文件后,它才会设置所有权和权限。这意味着所有权可能暂时不匹配。在您的情况下,原始目录归 拥有root:root
,因此所有权恰好匹配。您仍然观察到临时用户专属权限。
同样,过早恢复时间戳也是没有意义的。目录内的更改会影响它们。
无论如何,关键是tar
需要延迟恢复某些元数据,直到它“认为”已完成目录。
如何tar
知道这一点?嗯,它无法确切知道。您的提取tar
是从不可寻址的管道读取的,它绝对无法知道将来会得到什么路径。即使从可寻址文件读取tar
也会按顺序读取。
实际情况是,该工具假设在遇到share/wallpapers/
所有目录内容后,会立即出现。换句话说:在share/wallpapers/
遇到零个或多个目录内容后文件路径以 开头share/wallpapers/
。然后,不以 开头的路径share/wallpapers/
表示我们已完成wallpapers
,目录的元数据最终可以恢复。此方法适用于由单个tar
处理单个起点创建的档案(如您的情况),因为创建过程tar
确实按预期顺序处理文件。
由多个文件创建的档案tar
(例如 think about --append
)或以任意顺序指定多个文件时,可能包含不寻常顺序的成员。在这种情况下,提取时以下选项很有用:
--delay-directory-restore
延迟设置解压目录的修改时间和权限,直到解压结束。从具有不寻常成员排序的档案中提取时使用此选项。
因此,它会进一步延迟元数据的恢复。
如果您的提取使用了此选项,您会同时tar
观察到 和 的意外权限。您没有使用该选项,并且显然是在提取假设完成后进行的观察,因此对于此目录,您观察到了正确的权限。但在观察时尚未完成。/home/share/xindy/
/home/share/wallpapers/
tar
xindy
tar
wallpapers
等待命令完成。然后所有权限就应该正确了。