私は現在、シェルスクリプトで非常に非効率的です:
cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION
$ VERSIONというディレクトリにすべてを含めたいのですが、上記のスクリプトのようにすべてをコピーせずにこれを行う方法はありますか?
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
現在のディレクトリをtarしてプレフィックスを追加するために、これは私にとってはうまくいきました:
tar --transform 's,^\.,$VERSION,' -cf foo.tar .
ターリングしているファイルツリー内のシンボリックリンクを保持せずに逃げることができる場合は、次のようにすることができます
ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION
h
オプションはシンボリックリンクの逆参照を意味します。つまり、シンボリックリンクが存在したという事実とそれが指している内容を単に記録するのではなく、リンクが指すファイルまたはディレクトリを含めます。
ディレクトリプレフィックスを快適に追加するには、/
引数で--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の答えに固執します。