私は一般的なコンテンツ(ソースコード、yadda、yadda)を含むプロジェクトを持っています。
- システム構築 - 簡単です。
- システムのタールボールを作成する - 簡単です。
- タールボールの内容が抽出されると、ディレクトリに抽出されます。
fubar-VERSION/
これがトリッキーな部分です。
後者はシンボリックリンクを作成し、tar
プロジェクトの上のディレクトリからingすることで手動で実行できますが、それほどエレガントに感じることはありません。どんなアイデアがありますか?
明確にするために、次のようにできることを願っています。
; pwd
~/project
; scons release
[...]
; cp project-X.Y.Z.tbz /tmp
; cd /tmp
; tar jxvf project-X.Y.Z.tbz
./project-X.Y.Z/[...]
したがって、アーカイブは正しいバージョン番号を持つプロジェクト名を付けたディレクトリに抽出されます。
答え1
GNU tarの使用:
tar cjf ../fubar-4.2.tar.bz2 --transform='s/^\./fubar-4.2/' --exclude='*.o' .
従来のtar実装ではこれを行うことはできません。私が知っている限り、FreeBSD tarにも同様の機能はありません。
そして公園、cpio、tarのPOSIXの置換:
pax -w -s '/^\./fubar-4.2/' -s '/\.o$//' . | bzip2 >../fubar-4.2.tar.bz2
pax
現在、POSIX / Single Unix標準では必須ですが、多くのLinuxディストリビューションではデフォルトでそれをインストールしません。 GNU tar と pax の両方をサポートすることで、組み込まれていないほぼすべての unice を扱うことができます。
答え2
少なくとも、与えられたデフォルトの正規表現パターンに基づいてファイルまたはアーカイブメンバー名を変更するオプションがbsdtar 2.8.4
あります。-s pattern
# using '^\.' as pattern
bsdtar -czvf test.tar.gz .
bsdtar -tzvf test.tar.gz
bsdtar -s '|^\.|archive-X.Y.Z|' -xzvf test.tar.gz
# using '^[^/]*' as pattern
bsdtar -C .. -czvf test.tar.gz "$(basename "$(pwd -P)")"
bsdtar -tzvf test.tar.gz
bsdtar -s '|^[^/]*|archive-X.Y.Z|' -xzvf test.tar.gz