我看到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
答案 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”将需要三个系统调用(open
,unlink
,open
),而--overwrite
仅需要一个(open
截断)。