web-dev-qa-db-ja.com

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

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

78
Naftuli Kay

Tarファイル形式は、いくつかのヘッダーが連結された一連のファイルです。分解してコンテンツを入れ、元に戻すのはそれほど複雑な作業ではありません。そうは言っても、 Janderの説明 プログラムとしてのtarには、これを行うためのユーティリティ関数がありません。また、圧縮を行うと、変更の前と後の両方で、さらに複雑になります。

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

最初のオプションは archivemountFuse のプロジェクトです。これが そのチュートリアル です。お使いのシステムにはおそらくFuseがすでにあり、Fuseがない場合は、ディストリビューションにオプションがあります。

他のオプションは tarfs です。それは 使いやすい ですが、bzip2アーカイブの破損に問題があると聞いたので、最初にかなり徹底的にテストできます。

18
Caleb

アーカイブからファイルをプルするには、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回上書きすることを意味するため、おそらく聞きたくないものです。アーカイブがそれほど大きくない場合は、全体をuntarし、編集後に再タール化することをお勧めします。または、非圧縮アーカイブを使用することもできます。

48
Jander

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

9
rleibman