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

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

foo.tar.xz多くのファイル(200000など)を含む大容量ファイルがあります。私はこのアーカイブに私が望んでいないいくつかのファイル(約5000個)が含まれていることを発見しました。ファイル全体をマイディスクに解凍するのに十分なディスク容量がありません。また、これは属性/権限が失われる可能性があるという心配になります。 2枚をコピーするのに十分なスペースがあります。圧縮しかし、アーカイブ。アーカイブ(ファイル名に正規表現として指定)からインスタント、つまりアーカイブを別々のファイルに解凍せずに特定のファイルを削除できるツールはありますか?

答え1

GNU tarには--deleteアーカイブ処理オプションもあります。

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

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

次のことを避けてください。おそらくいいえあらゆる種類のテープメディアで動作します。ただし、tarパイプライン操作に問題はないので、一時的なtarファイルを使用してそのファイルでテープを上書きするだけです。また、圧縮ファイルでは機能しないため、ファイルを解凍する必要があります。

さらに、tarアーカイブ圧縮の線形的性質のため(設計上)、いかなる場合でも作業速度はかなり遅くなります。

答え2

(質問を誤って理解して修正しました)

あなたができる最善の方法は、ファイル全体を抽出、削除、再圧縮することです。

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

ファイルはtarから直接削除できません。

tar は、もともとランダム検索を正しく実行できなかったテープドライブに使用されるストリームです。理論的には、ディスクファイルシステムに穴を開けるか、残りのファイルを圧縮して書き換えることが可能ですが、ほとんどの場合意味がありません。 、すべてではありませんが、圧縮方法はファイルの前半に表示される内容に大きく依存します。これを正しく行うには、圧縮方法とtarファイルの種類をよく理解する必要があります。あまりにも複雑なので誰も気にしません。ファイルをアーカイブして無視する方が安いです。

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

答え3

に記載されているように最も投票された質問GNU タール--deleteこの問題を解決すると思われるオプションを実装しました。

しかし、引用するナウモフコメント:

注:このコマンドはtarファイルを破損する可能性があります。残念ながら、それは私のものを台無しにし、私はバックアップコピーを作成しないほど愚かでした。原因が何であるかはわかりませんが、私の場合、各ファイルに対して何千ものレプリカが作成され始めました。アーカイブサイズが元のサイズの10倍に増えたため、プロセスでSIGTERMを実行する必要がありましたが、この時点でデータが失われました。

少なくともtarバージョンv1.30を使用して再現できます。バージョン v1.34 では発生しません。。 armhf および i386 アーキテクチャに影響を与えます。

ファイルを削除しようとすると存在しないtarファイル内に重複エントリが表示され始め、ファイル全体が破損する可能性があります。

tarアップグレードが不可能な場合、回避策は--listtarファイル()内のすべてのファイルを一覧表示し、deleteを使用する前にファイルが存在することを確認することです--delete

答え4

~によると手動、ファイル名のリストを渡すことで、tarそのファイル名のみを抽出できます。たとえば、

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

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

関連情報