Open2

パイプで渡された複数の .tar を 1 つの .tar として扱う

hankei6kmhankei6km

.tar の中に複数の .tar が含まれる出力[1]からファイルを取り出したかった。

脚注
  1. 具体的には docker save など。 ↩︎

hankei6kmhankei6km

tar-i を使う

さがしたらすぐに見つかる。

https://superuser.com/a/941552

man の記述

https://manpages.ubuntu.com/manpages/impish/ja/man1/tar.1.html

-i, --ignore-zeros

アーカイブ中の 0 ばかりからなるブロックを無視する。通常、0 で埋められた 512 バイトブロックが 2 個連続すると、それはファイルの末尾 (EOF) を意味し、これに出会うと tar は読み込みを止める。 このオプションを指定すると、0 のブロックに出会っても読み込みを続けるので、 -A オプションを付けて作成したアーカイブを読み込むとき役に立つ。

-A で作成(結合)したアーカイブ用のオプションらしい。 -A の方を見ると圧縮したアーカイブはダメらしいのでたぶん複数の .tar.gz だとダメかな。

実際に使うときはこんな感じ。

ghcr.io/oras-project/oras:v1.0.0 を pull しておいて下記を実行すると bin/oras が取り出せる。最後の tar についてる -i がミソ。

$ docker save ghcr.io/oras-project/oras:v1.0.0 | tar -xOf- --wildcards "*layer.tar" | tar -ixf - "bin/oras"

$ ./bin/oras version
Version:        1.0.0
Go version:     go1.20.2
Git commit:     b58e7b910ca556973d111e9bd734a71baef03db2
Git tree state: clean