tarアーカイブからファイルを削除する


17

多くのファイルfoo.tar.xz(たとえば200000)を含む大きなファイルがあります。このアーカイブには、不要なファイル(約5000個)が含まれていることがわかりました。すべてをディスクに解凍するのに十分なディスク領域がありません。さらに、そうすると属性/権利が失われる可能性があります。ただし、圧縮アーカイブの2つのコピーをホストするのに十分なスペースがあります。アーカイブからいくつかのファイル(ファイル名に正規表現で指定)をオンザフライで、つまりアーカイブを個々のファイルに解凍せずに削除するツールはありますか?

回答:


14

(編集後、質問を誤解したため、編集後も編集されました)

最善の方法は、ファイル全体を抽出、削除、および再圧縮することです。

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

tarからファイルを直接削除することはできません。

tarは、もともとランダムシークを行わないテープドライブを対象としたストリームです-理論的には、ディスクファイルシステム上で穴を開けたり、残りのファイルを書き換えたりすることができますが、圧縮ではすべてではないにしてもほとんど意味がありません圧縮方法は、ファイル内で以前に発生したコンテンツに大きく依存します。これを適切に行うには、圧縮方法とtarファイル形式の両方について非常に詳細な知識が必要です。それは誰も気にしないほど複雑です。ファイルをそのままにしておいて無視する方が安価です。

この機能が必要な場合、tarはおそらく必要なものではありません。


これらのファイルは、アーカイブサイズの35%を占めています。あなたが指摘する制限は、ファイルを書き換えた場合にのみ適用されるようであり、その場外で変更する場合は適用できません(パックされたアーカイブを2回保存するのに十分なスペースがあります)。そのようなツールはありますか?
-FUZxxl

あなたの質問を誤解したかもしれません。結局tarをアンパックして、再パックする場合(実際にtarファイルを作成せずに、つまりtarからtarパイプへ直接転送する場合)、それは可能かもしれません。
frostschutz

ええ、それができます。ファイルに保持する必要があるuid / gids / attributesがあるだけです。また、解凍された表現を保存するのに十分なディスク容量がありません。ただし、2つのパックアーカイブを保存するのに十分なスペースがあります。
-FUZxxl

1
それはまったく問題ありません。1回のパスでこれを行うことができれば、時間が長くなることはありません。実際にストレージを解放しながら、高速な削除を可能にするアーカイブ形式は想像できません。
FUZxxl

1
--wildcardsヘルプ...私は、しなければならなかった./パターンの開始時に...しかし
ゲルトバンベルクデン

14

GNU tarには、--delete最近のアーカイブでも機能するオプションがあります。

たとえば、次のように使用します。

tar -vf yourArchive.tar --delete your/path/to/delete

注意してください:それは最も可能性が高いだろうではない磁気テープ媒体のいずれかの種類に取り組んでいます。しかしtar、パイプでの作業に問題はないので、一時的なtarファイルを使用して、後でテープを上書きするだけです。また、圧縮ファイルでは機能しないため、ファイルを解凍する必要があります。

また、tarアーカイブの(設計上)パックされた線形性のため、操作はいずれの場合もかなり遅くなります。


1
存在しますが、ランダムアクセスができないファイル(アーカイブの圧縮など)では機能しませんが、これは私のユースケースです。
FUZxxl

1
もう1つの問題は、削除するパターンを指定できないことです。の欠点にすでに対処している2013年のコメントに注意してくださいgtar --delete
FUZxxl

3
@FUZxxlはで-T動作し--delete--wildcardsファイル名ではなくパターンを使用できるため、パターンを含む一時ファイルを作成して使用しますunxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz。完全な正規表現は実行しません(必要な場合は、tar -t削除するファイル名のリストを使用して作成します)、ファイル名に一致するパターンのみです。
Random832

-4

マニュアルによると、ファイル名のリストを渡してtarそれらを抽出するだけです。例えば:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

--extractがどのように役立つかわかりません。詳しく説明してもらえますか?アーカイブ(またはそのかなりの部分)をディスクに解凍できないことに注意してください。
-FUZxxl

2
リンクだけを投稿しないでください。これはウィキです。ユーザーがあなたの答えを理解するためにページを離れる必要がないように十分なコンテンツを追加してください。
-jasonwryan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.