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

4du*_*ies 5 overwrite tar

我看到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
Run Code Online (Sandbox Code Playgroud)

K. *_*uhr 10

有一些微妙之处,但总的来说,有一些区别:

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

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

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

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

这也意味着,每个文件覆盖,“焦油”在默认情况下将需要三个系统调用(openunlinkopen),而--overwrite仅需要一个(open与截断)。

  • 我认为有一个“ --skip-old-files”选项可以满足您的需求。 (3认同)