web-dev-qa-db-ja.com

'tar --overwrite'は実際に何をしますか(またはしません)?

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
5
4dummies

微妙な点がいくつかありますが、一般的に、違いは次のとおりです。

デフォルトでは、「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つのシステムコール(openunlinkopen)が必要であるのに対し、--overwriteには必要なのは1つ(切り捨て付きのopen)。

10
K. A. Buhr