'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" 默认情况下需要三个系统调用(open
、unlink
、open
),而 --overwrite
将只需要一个(open
截断)。
我看到 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" 默认情况下需要三个系统调用(open
、unlink
、open
),而 --overwrite
将只需要一个(open
截断)。