tar内のファイルを更新する

tar内のファイルを更新する

Linux tar コマンドの場合:

tar uf test.tar test.txt

しかし、*BSD bsdtarコマンドオプションu = r = appendでは、ファイルを更新できず、ファイルの追加のみが可能であり、コンパイルを試みるlibアーカイブbsdtar は tar 内のファイルを更新できないことが証明されました。

では、なぜ Linux の tar コマンドは tar アーカイブ内のファイルを更新できるのに、 bsdtar はできないのでしょうか。

参照する: tar (Linux) tar (OpenBSD)

答え1

*BSD bsdtarコマンドオプションu = r = appendの場合、ファイルを更新できない

両方とも追加されると思いますが、man tarLinuxでは

   -r, --append
          append files to the end of an archive
   -u, --update
          only append files that are newer than the existing in archive

これを証明するテストがあります

$ uname -s
Linux
$ tar --version
tar (GNU tar) 1.15.1

$ echo aaa > a.txt
$ echo bbb > b.txt
$ echo ccc > c.txt

$ tar cvf x.tar *txt
a.txt
b.txt
c.txt

$ echo BBB > b.txt

$ tar -uvf x.tar b.txt
b.txt

$ tar tvf x.tar
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:10 a.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:17 b.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:43:26 c.txt
-rw-rw-r-- ian/ian           4 2012-11-08 16:48:22 b.txt

tarファイルにはb.txtの古いバージョンと新しいバージョンの両方が含まれていることに注意してください。

さて、あなたの質問の核心に移りましょう

Linux の tar コマンドは tar アーカイブ内のファイルを更新できるのに、bsdtar はできないのはなぜですか。

の BSD に Gnu tar をインストールできます/usr/local/bin/gtar

見るgtar-1.21-static.tgz (sh) のパッケージ情報


アップデート:

なぜ tar はインプレース更新できないのですか?

ランダムアクセスとシリアルメディア

「tar」という名前は、「tape archive」の短縮形です。このコマンドは、テープなどのシリアル メディアに保存されているアーカイブで使用できるように意図されています。テープ ドライブは、テープの途中に新しい長さのテープを挿入することも、既存のテープ部分を切り取ることもできません。また、書き込みと同時に読み取ることもできません。a.txt、b.txt、c.txt という内容のテープを、より大きな b.txt のテープに変換するには、まずテープ全体を読み取り、内容を (メモリまたはディスクに) 保存し、次にテープを巻き戻して新しい内容を完全に書き込む必要があります。テープの終了マークをシークして、新しいバージョンの b.txt を追加する方が高速です。

また、多くのテープ ドライブ (DAT など) は、書き込み操作の最後に自動的にテープ終了マークを追加しますが、これを防ぐことはできません。したがって、同じサイズまたはそれより小さい b.txt であっても、既存の位置で書き換えると、c.txt に永久にアクセスできなくなります。

ファイルシステムの問題

ファイルの途中にあるコンテンツを、長さの異なるコンテンツに置き換えることはできません。「bbb」を含むファイルを「bbbbbb」を含むファイルに置き換えるには、古いファイルを読み込んで新しいファイルを書き込む必要があります。したがって、最後に「bbbbbb」(およびファイル メタデータ ヘッダー) を追加する方が簡単です (かなり高速になる場合もあります)。

関連情報