回答:
(編集後、質問を誤解したため、編集後も編集されました)
最善の方法は、ファイル全体を抽出、削除、および再圧縮することです。
unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz
tarからファイルを直接削除することはできません。
tarは、もともとランダムシークを行わないテープドライブを対象としたストリームです-理論的には、ディスクファイルシステム上で穴を開けたり、残りのファイルを書き換えたりすることができますが、圧縮ではすべてではないにしてもほとんど意味がありません圧縮方法は、ファイル内で以前に発生したコンテンツに大きく依存します。これを適切に行うには、圧縮方法とtarファイル形式の両方について非常に詳細な知識が必要です。それは誰も気にしないほど複雑です。ファイルをそのままにしておいて無視する方が安価です。
この機能が必要な場合、tarはおそらく必要なものではありません。
--wildcards
ヘルプ...私は、しなければならなかった./
パターンの開始時に...しかし
GNU tarには、--delete
最近のアーカイブでも機能するオプションがあります。
たとえば、次のように使用します。
tar -vf yourArchive.tar --delete your/path/to/delete
注意してください:それは最も可能性が高いだろうではない磁気テープ媒体のいずれかの種類に取り組んでいます。しかしtar
、パイプでの作業に問題はないので、一時的なtarファイルを使用して、後でテープを上書きするだけです。また、圧縮ファイルでは機能しないため、ファイルを解凍する必要があります。
また、tarアーカイブの(設計上)パックされた線形性のため、操作はいずれの場合もかなり遅くなります。
gtar --delete
。
-T
動作し--delete
、--wildcards
ファイル名ではなくパターンを使用できるため、パターンを含む一時ファイルを作成して使用しますunxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz
。完全な正規表現は実行しません(必要な場合は、tar -t
削除するファイル名のリストを使用して作成します)、ファイル名に一致するパターンのみです。
マニュアルによると、ファイル名のリストを渡してtar
それらを抽出するだけです。例えば:
$ tar --file archive.tar --list
foo
bar
baz
$ tar --file archive.tar --extract foo