我看到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)
这也意味着,每个文件覆盖,“焦油”在默认情况下将需要三个系统调用(open,unlink,open),而--overwrite仅需要一个(open与截断)。