TL;DR
- パスを正規表現で置換すればいかようにも展開できる
- Dockerのファイル展開とか一行でシュッと書けて楽になるよ
Examples
説明のためのhoge.tar.gzの中身
$ tar ztf hoge.tar.gz
hoge/
hoge/dist/
hoge/dist/index.html
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
hoge/src/include/util.h
hoge/src/main.cpp
hoge/src/main.h
- hoge/無しに直接展開したい。--strip-components=1 と等価。
- EXPRESSION末尾のxで正規表現を指定できる。
$ tar zxvf hoge.tar.gz --transform="s,^[^/]+/,,x" --show-transformed-names
hoge/
dist/
dist/index.html
dist/index.js
LICENSE
README.md
src/
src/include/
src/include/util.h
src/main.cpp
src/main.h
- hoge/ではなくhuga/がいい。ルートディレクトリ名の変更
$ tar zxvf hoge.tar.gz --transform="s,^[^/]+,huga,x" --show-transformed-names
huga/
huga/dist/
huga/dist/index.html
huga/dist/index.js
huga/LICENSE
huga/README.md
huga/src/
huga/src/include/
huga/src/include/util.h
huga/src/main.cpp
huga/src/main.h
- .hは.hppに、.htmlは.htmに変えよう。;で複数の変換を並べる。
$ tar zxvf hoge.tar.gz --transform="s,\.h$,.hpp,x;s,\.html$,.htm,x" --show-transformed-names
hoge/
hoge/dist/
hoge/dist/index.htm
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
hoge/src/include/util.hpp
hoge/src/main.cpp
hoge/src/main.hpp
- .hや.cppは捨てよう。/dev/nullの活用。
tar zxvf hoge.tar.gz --transform="s,.*\.(h|cpp)$,/dev/null,x" --absolute-names --show-transformed-names
hoge/
hoge/dist/
hoge/dist/index.html
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
/dev/null
/dev/null
/dev/null
応用例
SDL2の各種ライブラリからbin/、include/、lib/以下を抜き出して直下に配置する。
$ ls
SDL2-devel-2.0.12-mingw.tar.gz SDL2_image-devel-2.0.5-mingw.tar.gz
$ find -name "SDL2*.tar.gz" | xargs -I{} tar zxvf {} --transform="s,^[^/]+/x86_64[^/]+/(bin|include|lib),\1,x;s,^SDL2,/dev/null/,x" --absolute-names --show-transformed-names
...
$ ls
SDL2-devel-2.0.12-mingw.tar.gz SDL2_image-devel-2.0.5-mingw.tar.gz bin include lib
あとがき
存在しないディレクトリとかtarが適当に用意してくれます。mkdirもcpもmvも不要で楽です。