我想用 较新的 文件更新现有的tar文件。
在GNU,我读到:
4.2.3更新档案
在上一节中,您学习了如何使用'--append'添加 将文件存档到现有存档。相关操作是'--update'(' - u')。 '--update'操作通过比较日期来更新tar存档 指定的归档成员与具有该文件的日期的对应 一样的名字。如果文件最近被修改过了 归档成员,然后将该文件的较新版本添加到 存档(与'--append'一样)。
然而, 当我运行我的tar更新命令时,即使修改日期完全相同,也会附加文件。我想只附加要被涂焦的文件的修改日期比tar中已有的文件更新...
tar -uf ./tarfile.tar /localdirectory/ >/dev/null 2>&1
目前,每次更新时,tar都会增加一倍......
答案 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
但是,更新后的项目仍将被追加。无法tar
(t
猿ar
香葱)文件的附加内容,不能被修改。