既存のtar.gzアーカイブにファイルを追加/更新しますか?


73

tar.gzアーカイブ内のファイルを追加/更新する方法はありますか?基本的に、にファイルを含むアーカイブがあり、/data/data/com.myapp.backup/./files/settings.txtそのファイルをアーカイブからプルし(既に完了しています)、編集が完了したらアーカイブにプッシュしたいと思います。どうすればこれを達成できますか?.パスに問題があるのですか?


2
+1。これにより、OS Xでの作業が非常に簡単になります。現在、私はすべての隠しファイルのようなディレクトリを手できれいにしてから、ディレクトリを.DS_Store再tarする必要があります。

回答:


15

tarファイル形式は、いくつかのヘッダーと連結された一連のファイルです。それをバラバラにして内容を入れ、元に戻すのはそれほど複雑な仕事ではありません。そうは言っても、Janderは、プログラムとしてのtarがこれを行うユーティリティ機能を持たず、変更を行う前と後の両方で圧縮に伴う追加の問題があることを説明しました。

しかし、仕事のためのツールがあります!少なくとも2つのシステムがあり、圧縮されたtarアーカイブをフォルダーにループバックマウントしてから、ファイルシステムに変更を加えることができます。完了したら、フォルダをアンマウントし、圧縮アーカイブをロールする準備ができました。

最初のオプションの1つは、FUSEのarchivemountプロジェクトです。ここにそのチュートリアルがあります。お使いのシステムには、おそらく既にFUSEがあり、それがなければ、ディストリビューションにオプションが必要です。

他のオプションはtarfsです。それはだ簡単に使用でき、私はあなたがかなり徹底的に最初にそれをテストする可能性があるので、それが破損bzip2のアーカイブでいくつかの問題を持って聞きました。


1
UbuntuとDebianにパッケージ化されているAVFSを使用します。archivemountとtarfsがAVFSとどのように比較されるか知っていますか?
ジル

正直なところ、私はそうではありませんが、代替手段について言及した今、AVFSを調べたいと思っています。archivemountとtarfsの両方を使用しましたが、廃止されたプロジェクトから長い間使用されており、現在の状態がわかりません。その経験から、実装が完全に機能していても、概念が概念的に間違っていると判断しました。
カレブ

archivemountの仕組みを見てみました。既存の.tar.gzファイルは変更されませんが、マウント解除すると、元のファイルの名前が変更され、その場所に新しいtarファイルが作成されます。優れたユーザーエクスペリエンスを探している場合は素晴らしいですが、効率上の理由でアーカイブ全体を書き換えないようにしたい場合は役に立ちません。
ジャンダー

@Janderそれはそれを指摘するためのものです。ただし、すべての圧縮アーカイブマウントオプションに適用されると確信しています。問題は圧縮されていないファイルの個々の部分、全体的なファイル内部ヘッダーであり、すべてはextractiするために、他のもののために圧縮され、順番にあると予想gzipのが上で実行する必要がありますようになり、全体のデータセット。これを抽出して圧縮を再実行し、データファイル全体を書き換えずに、途中で何かを挿入する方法はありません。したがって、それが概念的に間違ったソリューションであることについての私の以前のコメント。アーカイブはアーカイブです。
カレブ

43

アーカイブからファイルをプルするには、を使用できますtar xzf archive.tar.gz my/path/to/file.txt。ファイルのパスにあるディレクトリも作成されることに注意してください。tar t(つまりtar tzf archive.tar.gz)を使用して、アーカイブ内のファイルをリストします。

tarファイルの「インプレース」更新をサポートしていません。ただし、アーカイブ内のファイルと同じパスを持っている場合でも、アーカイブの最後にファイルを追加できます。その場合、ファイルの両方のコピーがアーカイブ内にあり、後で追加されたファイルが以前のコピーをオーバーライドします。これに使用するコマンドはtar r(またはtar u、アーカイブよりも新しいファイルのみを追加するために)使用するコマンドです。.パスでは問題になることはありません。

ただし、問題があります。圧縮アーカイブに追加することはできません。だからあなたはする必要があります:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

アーカイブ全体を2回書き換えることを意味するため、これはおそらく聞きたくないことです。非常に大きなアーカイブではない場合は、すべてを展開し、編集後に再度展開することをお勧めします。または、非圧縮アーカイブを使用することもできます。


この答えは、標準tarプログラムを扱う場合にのみ正しいです。ファイル形式としてのTarは、実際には非常にアクセスしやすいです。自分でコンテンツを更新するスクリプトを簡単に書くことができますが、すでにこれを行うツールは他にもあります
カレブ

23
また、Unixの道にこれを行うことができます:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
サイモン・リヒター

2
IIRCでは、2つのgzipされたファイルを単純に連結できます。その結果、圧縮されていない両方のファイルが連結された、より大きなgzipファイルが作成されます。
FUZxxl

ファイルが解凍されたら、-updateフラグを使用することはできませんか?
ピエトロ

@FUZxxl +1 gzip連結について言及した場合
ヨハンブール

9

タールはもともとテープに使用することを意図していたため、ファイルの「置換」は実際には設計に含まれていません。ただし、-deleteを使用して元のtarからファイルを削除し、-uを使用してtarを更新し、ファイルを再追加できます。tarはアーカイブを内部で再編成する必要があるため、少し時間がかかる場合があります。


StackExchangeへようこそ!あなたの答えには、別の答えですでに行われた提案のみが含まれます。重複するのを避けるために、回答する前に質問に対する他の回答を読んでください。
-JigglyNaga

1
回答を少し編集しました。私は他の答えが--delete
rleibman

-5

Linux x86_64 GNU / Linuxでその操作を実行するには、単に次のコマンドを使用します。

tar cvfpz /path/archive.tar -T list.txt

このコマンド/pathは、ファイルに含まれるlist.txtファイルのリストを使用して、圧縮アーカイブを作成します。


6
そのファイル/path/archive.tarを追加/更新する代わりに、既存のファイルを上書きします。
アントン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.