'tar --overwrite'实际上做什么(或不做什么)?

时间:2018-06-26 19:55:57

标签: tar overwrite

我看到Linux tar有一个选项--overwrite。但是覆盖似乎是默认设置。此外,指定tar --no-overwrite不会更改此行为,因为信息文件似乎建议这样做。

那该选项实际上是做什么的?

我用

进行测试
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

1 个答案:

答案 0 :(得分:5)

有一些细微之处,但是总的来说就是这样:

默认情况下,“ 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截断)。