我想用*更新的*文件更新现有的tar文件。
在GNU,我读到:
4.2.3更新存档
在上一节中,您学习了如何使用“--append”将文件添加到现有归档文件中。相关操作是'--update'('-u')。'--update'操作通过将指定存档成员的日期与同名文件的日期进行比较来更新tar存档。如果该文件的修改时间比归档成员的修改时间更近,则将该文件的较新版本添加到归档中(与'--append'一样)。
然而,当我运行我的tar update命令时,即使它们的修改日期完全相同,文件也会被追加。我只想追加的地方修改日期的文件要tar是新的比那些已经在tar…
tar -uf ./tarfile.tar /localdirectory/ >/dev/null 2>&1
目前,每次我更新,焦油的大小增加一倍...
5条答案
按热度按时间3hvapo4f1#
您所描述的更新意味着存档中的文件已被 * 替换 *。如果新的副本小于存档中的副本,则可以直接重写。但是,如果新的副本更大,tar将不得不将现有的归档条目归零并追加。这样的更新会留下“\0”或其他未使用的字节,所以任何普通的计算机用户都希望删除这些部分,这将通过将包含存档内容的字节“向上移动”到文件的开头来完成(想想C的memmove)。
然而,这种就地移动操作会涉及查找-读取-查找-写入周期,成本很高,特别是当您在磁带的上下文中查看时-tar最初是为磁带设计的-即寻道性能无法与硬盘相比的设备。这样的行动会很快把胶带磨坏的。哦,当然,WORM设备也不支持此移动操作。
zqry0prt2#
如果不想使用
-P
开关,如果当前目录是我们要更新的目录的父目录,tar
命令中指向该目录的路径将不是是绝对路径,则tar -u...
可以正常工作。例如:
我们要更新catalog /home/blabla/Dir。我们是这样做的:
一般来说,更新必须从与创建相同的位置进行,以使路径一致。
也可能:
ohtdti5x3#
您可以每次简单地创建(而不是更新)存档:
tar -cvpf tarfile.tar *
这将解决每次存档大小加倍的问题。当然,它每次都会生成整个存档。
agxfikkp4#
默认情况下,tar会从成员名中删除前导
/
,但它会在决定需要更新哪些内容后执行此操作。因此,如果要归档绝对路径,则需要
cd /
并使用相对路径,或者添加-P/--absolute-names
选项。但是,更新后的项目仍将被追加。
tar
(t
apear
chive)文件不能修改,除非通过追加。l7wslrjt5#
警告!当说到“日期”时,它意味着 * 任何 * 日期,并且包括访问时间。
如果您的文件已经以任何这样的方式被访问(一个简单的
ls -l
就足够了),那么tar就可以做它所做的事情!你得另想办法做你想做的事。可能会使用一个sentinel文件,并查看其修改日期是否小于您希望追加的文件。