如何在使用 tar 时保持文件所有权

Posted

技术标签:

【中文标题】如何在使用 tar 时保持文件所有权【英文标题】:how to keep file ownership while using tar 【发布时间】:2013-06-24 10:56:34 【问题描述】:

我目前正在为我们的服务器编写一个自动备份脚本。我在脚本中使用 UNIX tar 命令来归档代码存储库。

在我的 PERL 脚本中,我使用 tar 命令如下:

system("tar -jcpf $destPath/$string.tar.bz2 -X $exclusionFile $targetPath");

我想在提取 tar 存档时保留文件所有权。我试图列出 tar 存档内容与

tar -jtvf

并且该列表包含每个文件的正确文件所有权,但在提取存档时,文件所有权更改为当前用户。

有什么方法可以提取 tar 存档并保留每个文件的原始文件所有权?

【问题讨论】:

我会快速补充:当你可以在纯 Perl 中执行 system 命令时,不要执行它。看Archive::Tar。很长一段时间以来,它都是标准 Perl 包的一部分。它将在各种操作系统中运行,并让您更好地控制您的 tarball。 【参考方案1】:

提取时将选项--same-owner 提供给tar。

tar --help 告诉:

   --same-owner
          create extracted files with the same ownership

【讨论】:

我尝试提取 tar 存档:tar --same-owner -jxvf naveExample2.tbz2 在提取 tar 时出现以下错误:tar: backup/superlinksnpTest.txt: Cannot change Owner to uid 50537,gid 50538:不允许操作 tar:由于以前的错误而退出失败状态我做错了吗? 您必须是 root 才能启用 tar 更改存档内容的 UID/GID。 并非所有tar 的实现都包含--same-owner 参数,甚至没有--help 标志。始终使用man tar 来查看您的tar 版本有哪些可选参数。 谢谢。在以 root 身份运行安装脚本时,我遇到了相反的问题,导致使用创建存档时使用的任何奇怪的所有者/组组合来提取存档。在我的情况下,所需的选项是 --no-same-owner 以达到相反的效果 - 更改超级用户的 tar 提取的默认行为。【参考方案2】:

您希望在使用-p 开关执行tar -x 时“保留”文件属性。显然,您需要成为 root 才能获得所需的结果。

         -p, --insecure, --preserve-permissions
         (x mode only) Preserve file permissions.  Attempt to restore the
         full permissions, including owner, file modes, file flags and
         ACLs, if available,

许多 POSIX 系统还提供 paxcpio,它们可以作为 tar 的替代品。

【讨论】:

以上是关于如何在使用 tar 时保持文件所有权的主要内容,如果未能解决你的问题,请参考以下文章

Linux下如何解压tar.gz和tar.bz2和zip

如何在Linux上使用tar命令解压和压缩文件

如何创建Tar Gz文件

[LINUX] 用"tar -c"打包文件时,如何排除其中的链接文件?

如何使用 tar 压缩当前目录中的所有文件,但不输入 tar 文件和所有文件的名称?

如何在Linux上使用tar命令解压和压缩文件