web-dev-qa-db-ja.com

tarball内のルートディレクトリを指定します

実行する方法はありますか

tar cjvf foo.tar.bz2 project-root

Tarballが抽出されるときに、project-rootに抽出されず、代わりに他の何かに抽出されるように?つまり.

tar xjvf foo.tar.bz2
cd something-else
# see all files that were within original project-root

-Cは知っていますが、何か他のものがまだ存在しないようにしたいと思います。

7
Pistos

最初にシンボリックリンクを作成し、それに続いてtarを作成します。

ln -s project-root something-else
tar cjf foo.tar.bz2 something-else/*
rm something-else

/*は、シンボリックリンク自体を単にタール化するのではなく、リンクをたどってすべてのコンテンツを選択するために必要です。あるいは、GNU tarで-hオプションを使用することもできます(ただし、これは内部のリンクをたどりますが、これは実行したくない場合があります)またはHオプションでBSD tar(Macのように)。

プロジェクトルート内からこれを行うこともできます。

cd project-root
ln -s . something-else
tar cjf foo.tar.bz2 --exclude=something-else/something-else something-else/*
rm something-else

(上記のように)明示的に除外しない限り、シンボリックリンクはtarballにも存在します。

明らかに、これを何度も行っていて、その周りにぶら下がっているシンボリックリンクを気にしないのであれば、毎回削除して再作成する必要はありません。

4
tremby

7-Zip GUI (およびおそらく他のアーカイバプログラムも)を使用して、tarball内のproject-rootの名前を変更できます。ただし、これにより、圧縮されたtarballで完全な解凍-再圧縮サイクルが実行される場合があります。 (読んでください:これは、大きくて強く圧縮されたタールボールでは時間がかかる場合があります。)

やりたいことを行う最良の方法は、tarballを作成する前に名前を変更することです。簡単な方法は、一時的にproject-rootの名前をsomething-elseに変更することです。 )::

# temporary rename; tar; restore original name
$ mv project-root something-else ; tar cjf foo.tar.bz2 something-else ; mv something-else project-root

おそらくもう少し複雑になります。tarballに必要な名前でコピーを作成します。これにより、後で修正するプロセスで採用される可能性のある潜在的なバグやステップの欠落を回避できます。他の目的のために両方のコピーを保持したい場合があります。

# make me a copy
$ ( cd project-root ; tar cf - . ) | ( mkdir something-else; cd something-else; tar xf - )

# test the copy here if needed
$ diff -r --brief project-root/ something-else/

# create my tarball
$ tar cjf foo.tar.bz2 something-else
2
quack quixote