Linuxtarにはオプション--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」が既存のファイルを削除して再作成するため、新しいiノード番号を取得することです。 --overwrite
を使用すると、iノード番号は変更されません。
$ 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」に3つのシステムコール(open
、unlink
、open
)が必要であるのに対し、--overwrite
には必要なのは1つ(切り捨て付きのopen
)。