Setting file permissions on contents of tarfile
是否有办法在创建tarfile时(或之后不久)在分发之前将其内容发送到
笨拙的方法是复制目录,然后复制
我在一台Solaris 10机器上。
背景:
根目录在我们的ClearCaseVOB中,具有特定的文件权限,递归地。一个tarfile被创建并分发给我们组织中的多个"客户"。大多数只需要读/执行权限(特别是不希望它们是可写的),但是一个组尤其需要它们的副本是递归可写的,因为它们可以编辑这些文件,甚至可以还原回"新"副本(即,在我给它们的原始状态下)。
这一群体在技术上有些挑战。尽管它们有关于tarfile"操作方法"的指令,但它们似乎总是忘记(或弄错)将文件设置为一旦不被删除就可递归写入。这导致我打电话来诊断各种各样的问题,根本原因是他们忘记了(或做得不正确)对展开的目录进行更改。
在你问之前,是的,我给他们写了一个脚本untar/chmod(专门为他们写的),但是……哦,没关系。
所以,我想我应该创建一个单独的、递归可写的tar版本,然后分发给他们。正如我最初所说,我总是可以创建一个dir的副本,使副本递归地可写,然后对copy dir进行tar操作,但是dir相当大,磁盘空间有时接近满(它可能会有很大的变化),因此创建dir的副本将无法100%地使用。
使用GNU TAR,在创建存档时使用
1 | tar cf archive.tar --mode='a+rwX' * |
但请注意,提取存档文件时,umask将默认应用。因此,除非用户的umask为000,否则权限将在此时更新。但是,可以使用
1 | tar xfp archive.tar |
在tar命令之前,您可以很容易地更改文件的权限,尽管我通常建议人们不要将777用于除/tmp以外的任何其他用途,但对目录使用755或最坏情况下的775更有效。这样你就不会让世界写你的目录,这通常是明智的。
大多数Unix用户不喜欢递归地设置权限,因为它对不应该是可执行文件(例如配置文件)设置了执行位,以避免这种情况发生。他们在一段时间前发明了一种新的使用chmod的方法,称为符号模式。阅读chmod上的手册页应提供详细信息,但您可以尝试:
1 | cd $targetdir; chmod -R u+rwX,a+rX .; tar zcvf $destTarFile . |
其中$targetdir是您要创建的目录,$desttarfile是您要创建的tar文件的名称。
当您解开tar文件时,将尝试保留权限。当然,某些规则控制着这个过程——只有当root正在进行untaring时,才会保留所有者的uid和gid,否则,它们将被设置为当前过程的efective uid和gid。