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

what does 'tar --overwrite' actually do (or not do)?

我看到 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

有一些细微差别,但总的来说,区别如下:

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