tarにプレフィックスを追加


15

私は現在シェルスクリプトで非常に非効率的にしています:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

すべてを$ VERSIONというディレクトリに格納する必要があります。上記のスクリプトのようにすべてをコピーせずにこれを実行する方法はありますか?


そもそもコピーするのはなぜですか?どうしてtar cjf archive.tar.bz2 $MYPATH
チューウィー

1
@Chewieは、アーカイブの親ディレクトリとして$ versionが欲しいと言った。
ケント

ああ、私は今それを見る。
チュウィー

回答:


24

のGNUバージョンはオプション(およびそのエイリアス)をtarサポートし--transformます。--xformこのように使用できます

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

たとえば、このディレクトリツリーを考えます

foo
└── foo.txt

コマンド

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

のようなアーカイブを作成します

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
このアプローチがシンボリックリンクを破壊する可能性があることは注目に値します。stackoverflow.com/a/29661783/388803にflags=r;記載されているように、プリペンディングにより問題が解決されます。
エレゴン

末尾のスラッシュを含めないでください。トランスフォームに末尾のスラッシュを挿入すると、元のプレフィックスが失われます。例えばs/^a\//b\//、他のすべてのファイルが下にある間、tar -tまだ表示a/されb/ます。これは危険だと思いますが、tarファイル内のディレクトリではない同じプレフィックスを持つ他のファイルから保護する必要はありません。したがって、末尾のスラッシュは問題ありa/ません。変換される場合を処理する最良の方法を知っていてもaa/、それがルートノードの兄弟であるかどうかは気にしません。
ThorSummoner

14

現在のディレクトリをtarしてプレフィックスを追加するために、これは私のために働いた:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

あなたがtarしているファイルツリー内のシンボリックリンクを保存せずに逃げることができるなら、あなたはできます

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

このhオプションは、シンボリックリンクの逆参照を意味します。つまり、シンボリックリンクが存在したという事実とそれが指し示したものを単に記録するのではなく、リンクが指すファイルまたはディレクトリを含めます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.