如何更新tar(不附加)

时间:2011-12-13 22:56:36

标签: linux bash compression tar

我想用 较新的 文件更新现有的tar文件。

在GNU,我读到:

  

4.2.3更新档案

     

在上一节中,您学习了如何使用'--append'添加   将文件存档到现有存档。相关操作是'--update'(' - u')。   '--update'操作通过比较日期来更新tar存档   指定的归档成员与具有该文件的日期的对应   一样的名字。如果文件最近被修改过了   归档成员,然后将该文件的较新版本添加到   存档(与'--append'一样)

然而, 当我运行我的tar更新命令时,即使修改日期完全相同,也会附加文件。我想只附加要被涂焦的文件的修改日期比tar中已有的文件更新...

tar -uf ./tarfile.tar /localdirectory/ >/dev/null 2>&1

目前,每次更新时,tar都会增加一倍......

5 个答案:

答案 0 :(得分:3)

您描述的更新意味着存档中的文件已被替换。如果新副本小于存档中的副本,则可以直接重写。但是,如果新副本较大,则tar必须将现有存档条目归零并追加。这样的更新会留下'\ 0'或其他未使用的字节的运行,因此任何普通的计算机用户都希望删除这些部分,这可以通过将包含存档内容的字节“向上移动”到文件的开头来完成(想想C的的memmove)。

然而,这样的就地移动操作,包括寻找 - 读取 - 寻找 - 写入周期,是昂贵的,特别是当你在磁带的背景下看它 - 这是tar设计的对于最初 - ,即具有与硬盘无法比较的搜索性能的设备。你可以通过这样的移动操作很快地磨损磁带。哦,当然,WORM设备也不支持此移动。

答案 1 :(得分:1)

警告!在谈到“日期”时,它意味着任何日期,其中包括访问时间。

如果你的文件是以任何这种方式访问​​过的(一个简单的ls -l就足够了)那么tar是正确的做法!

你需要找到另一种方法来做你想做的事。可能使用sentinel文件并查看其修改日期是否小于您要附加的文件。

答案 2 :(得分:1)

您每次只需创建(而不是更新)存档:

tar -cvpf tarfile.tar *

这将解决您的存档每次大小翻倍的问题。但是,当然,它每次都会生成整个存档。

答案 3 :(得分:1)

如果您不想使用" -P"如果当前目录是我们要更新的目录的目录,那么switch tar -u ...正常工作,tar命令中该目录的路径将是一条绝对的道路 例如:
我们想更新目录/ home / blabla / Dir。我们这样做:
cd / home / blabla
tar -u -f tarfile.tar目录
通常,更新必须与创建的位置相同,以便路径一致 也有可能:
cd / home / blabla / Dir
tar -u -f /path/to/tarfile.tar。

答案 4 :(得分:0)

默认情况下,tar从成员名称中删除前导/,但这是在确定需要更新的内容之后执行的。

因此,如果要归档绝对路径,则需要cd /并使用相对路径,或者添加-P/--absolute-names选项。

cd /
tar -uf "$OLDPWD/tarfile.tar" localdirectory/ >/dev/null 2>&1
tar -cPf tarfile.tar /localdirectory/ >/dev/null 2>&1
tar -uPf tarfile.tar /localdirectory/ >/dev/null 2>&1

但是,更新后的项目仍将被追加。无法tartar香葱)文件的附加内容,不能被修改。