web-dev-qa-db-ja.com

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

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

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

$ VERSIONというディレクトリにすべてを含めたいのですが、上記のスクリプトのようにすべてをコピーせずにこれを行う方法はありますか?

18
Robby75

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
27
toro2k

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

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

ターリングしているファイルツリー内のシンボリックリンクを保持せずに逃げることができる場合は、次のようにすることができます

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

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

0
Ian Roberts

ディレクトリプレフィックスを快適に追加するには、/引数で--transformとは異なる区切り文字を使用します。 +または,は、アンディの答えと同じです。

したがって、より単純なケースでは、現在のディレクトリに多数のファイルがあり、 tarbomb を作成したくないとします。

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

構文はs+search+replace+で、^の場合、ファイル名の先頭と一致します。

そして今、ただOPに答えるために-次のように実行することで、ディレクトリ全体を/tmpにコピーすることを回避できます。

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

または:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(ハードリンク、シンボリックリンクの問題を回避)

最後の2つはエンターテインメントの価値のために含まれており、私自身はtoro2kの答えに固執します。

0
Tomasz Gandor