如何在使用 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 系统还提供 pax
、cpio
,它们可以作为 tar
的替代品。
【讨论】:
以上是关于如何在使用 tar 时保持文件所有权的主要内容,如果未能解决你的问题,请参考以下文章
[LINUX] 用"tar -c"打包文件时,如何排除其中的链接文件?