【问题标题】:How to update tar (NOT append)如何更新 tar(不附加)
【发布时间】:2020-06-12 22:57:06
【问题描述】:

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

在 GNU,我读到:

4.2.3 更新存档

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

然而, 当我运行我的 tar update 命令时,即使它们的修改日期完全相同,也会附加这些文件。我只想在要被 tar 的文件的修改日期比 tar 中已有的更新日期的地方追加...

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

目前,每次更新时,tar 的大小都会翻倍...

【问题讨论】:

  • 可能是因为我省略了标志以保留开头的斜杠吗?
  • 是的,你是对的。添加-P 标志使其工作。或者您可以使用cd /; tar -uf /path/file.tar localdirectory(出于某种奇怪的原因,tar -uf file.tar -C / localdirectory 不适用于我的 tar 版本的顺序调用)。
  • 不可能:tar 的意思是原来的磁带存档,你不能替换磁带中间的文件。
  • 也许 tardy(一个 tar 后处理器)会让你感兴趣tardy.sourceforge.net

标签: linux bash compression tar


【解决方案1】:

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

然而,这种就地移动操作会涉及查找-读取-查找-写入周期,成本很高,尤其是当您在磁带的上下文中查看它时 - 设计了 ​​tar对于最初——,即具有无法与硬盘相比的寻道性能的设备。使用这种移动操作,您会很快磨损磁带。哦,当然,WORM 设备也不支持这种移动操作。

【讨论】:

    【解决方案2】:

    如果您不想使用“-P”开关 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 .

    【讨论】:

      【解决方案3】:

      您每次都可以简单地创建(而不是更新)存档:

      tar -cvpf tarfile.tar *

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

      【讨论】:

        【解决方案4】:

        默认情况下,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 (tape archive) 文件不能通过追加修改excpet。

        【讨论】:

        • 不知何故,8 年来没有人将实际答案放在答案中。
        【解决方案5】:

        警告!当谈到“日期”时,它表示任何日期,其中包括访问时间。

        如果您的文件已被以任何此类方式访问(一个简单的ls -l 就足够了),那么 tar 做它所做的事情是正确的!

        你需要找到另一种方式来做你想做的事。可能使用一个哨兵文件,看看它的修改日期是否小于您希望附加的文件。

        【讨论】:

        • 好吧,你说的很有道理。对不起我之前的困惑。那么,我猜 tar 在访问日期而不是修改日期上运行?这似乎很愚蠢,因为每次我运行 tar -u...lol 时 tar 都会访问这些文件
        • 一个文件有三个日期:访问时间 (atime)、inode 修改时间 (ctime) 和内容修改时间 (mtime)。如果其中任何一项发生更改,则文件的“日期”会更改。
        • 附录:有些操作影响atime,例如stat()lstat()。这可能是 tar 用于 -u 的内容。
        猜你喜欢
        • 2012-12-30
        • 2012-04-03
        • 2022-10-19
        • 2019-04-09
        • 2017-09-10
        • 2020-05-18
        • 2019-10-26
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多