【问题标题】:what does 'tar --overwrite' actually do (or not do)?'tar --overwrite' 实际上做什么(或不做什么)?
【发布时间】:2018-12-05 14:59:28
【问题描述】:

我看到 Linux tar 有一个选项 --overwrite。但覆盖似乎是默认设置。此外,指定 tar --no-overwrite 并不会像 info 文件所暗示的那样改变这种行为。

那么这个选项到底有什么作用呢?

我用它测试它

ls -l >junk
ls -l junk
tar -cf junk.tar junk
>junk
ls -l junk
tar  <option?> -xf junk.tar  # option varies, results do not
ls -l junk

【问题讨论】:

    标签: tar overwrite


    【解决方案1】:

    有一些细微之处,但一般而言,区别如下:

    默认情况下,“tar”会尝试打开带有O_CREAT | O_EXCL 标志的输出文件。如果文件存在,这将失败,之后“tar”将重试,首先尝试删除现有文件,然后使用相同的标志重新打开(即创建一个新文件)。

    相比之下,使用--overwrite 选项,“tar”会尝试打开带有O_CREAT | O_TRUNC 标志的输出文件。如果文件存在,它将被截断为零大小并被覆盖。

    主要含义是“tar”默认情况下将删除并重新创建现有文件,因此它们将获得新的 inode 编号。使用--overwrite,inode 编号不会改变:

    $ ls -li foo
    total 0
    5360222 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
    $ tar -cf foo.tar foo
    $ tar -xf foo.tar  # inode will change
    $ ls -li foo
    total 0
    5360224 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
    $ tar --overwrite -xf foo.tar  # inode won't change
    $ ls -li foo
    total 0
    5360224 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
    $ 
    

    这也意味着,对于每个被覆盖的文件,“tar”默认需要三个系统调用(openunlinkopen),而--overwrite 只需要一个(open 带有截断) .

    【讨论】:

    • 我从中得知,差异将很重要,主要是当文件有多个链接、禁止权限或文件在其他地方打开时。而我想要的——保存任何现有文件——是不可能的。我真的希望在 cp 和 mv 中有相当于 --no-clobber 的东西。
    • 我认为有一个“--skip-old-files”选项可以满足您的需求。
    • 确实如此。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    相关资源
    最近更新 更多