パイプラインから別のtarファイルを生成するためにtarファイルの内容をフィルタリングする方法は?

パイプラインから別のtarファイルを生成するためにtarファイルの内容をフィルタリングする方法は?

権限、mtimesなど、保存したいさまざまな属性を持ついくつかのディレクトリを含む外部システムの単一のtarファイルを考えてみましょう。通常のユーザー(ルートではなく)としてこれらのファイルのサブセットを簡単に取得する方法は?

似たようなものを探しています。

tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz

このtarアーカイブで主な属性(所有権、グループ、モード、mtime)を保存することも重要です。 tarファイルの他の属性(例:タイトルキーワードの拡張

そのサブディレクトリに大容量ファイルが含まれている場合、一時ディレクトリの使用を回避するソリューションのボーナスポイント。

ベストアンサー1

bsdtar(libarchiveベース)標準入力から標準出力にtar(および他のいくつかのアーカイブ)をフィルタリングできます。例えば、一致するファイル名のみを渡すパターンで、s/old/new/名前を変更できます。 Ubuntuのようなほとんどのディストリビューションはすでにパッケージ化されています。bsdtar libarchive-tools

sudo apt-get install libarchive-tools   # or aptitude, if you have it.

# example from the man page:
bsdtar -c -f new.tar --include='*foo*' @old.tgz
#create new.tar containing only entries from old.tgz containing the string ‘foo’
bsdtar -czf - --include='*foo*' @-  # filter stdin to stdout, with gzip compression of output.

入力/出力用に選択できる圧縮形式がいくつかあるため、gunzip / lz4を介して手動でパイプする必要はありません。-stdinを使用する@tarfileか、-通常どおりstdoutを使用する構文を使用できます。


私の検索でもこのストリーミングtar修正ツールが登場しましたが、JavaScriptを使用して必要なアーカイブ変更を定義したいと思います。 (すべてがjsで書かれているようです。)

https://github.com/mafintosh/tar-stream

おすすめ記事