okkyの日記: tarを作る時でも展開するときでもいいが、オリジナルと異なるpath名にしたい。どうするか? 7
つまりですな。
GNU Tar には --transform というオプションがあって、tar cf の最中に、アーカイブ対象ファイルのパス名を正規表現でグリグリと書き換えられるのです。ただし、\ 周りの扱いが変な気がしますが。
たとえば
~/test $ ls -alF ./
total 12
drwxr-xr-x+ 1 test None 0 Aug 8 23:10 ./
drwxr-xr-x+ 1 test None 0 Aug 8 23:09 ../
-rw-r--r-- 1 test None 0 Aug 8 23:10 afo
-rw-r--r-- 1 test None 0 Aug 8 23:10 bfo
となっているディレクトリでは
~/test $ tar cvf hoge.tar ./*fo
./afo
./bfo
~/test $ tar tvf hoge.tar
-rw-r--r-- test/None 0 2012-08-08 23:10 ./afo
-rw-r--r-- test/None 0 2012-08-08 23:10 ./bfo
と、こうなるわけですが。
~/test $ tar -cv --transform='s/fo$/hage/g' -f hoge.tar ./*fo
./afo
./bfo
~/test $ tar tvf hoge.tar
-rw-r--r-- test/None 0 2012-08-08 23:10 ./ahage
-rw-r--r-- test/None 0 2012-08-08 23:10 ./bhage
と、このように、「fo」の部分を「hage」に置き換えることができるのです。もちろん、./ の部分だって置き換えられます。
.
が、これは「GNU tarの」機能。BSDとか SVR4とかの tar には存在しないわけです。
さらに言うと、対象環境が客先だったりすると、勝手に「GNU tar を入れて」とか言うわけにも行かない。
実は同じようなパス名・ファイル名を持ったマシンが何十台もあって、そいつらからデータをかき集めなくちゃいけない。パス名の中にマシン名を入れたいが、オリジナルのマシン上にそんなディレクトリ構造は作りたくない(まぁ、作って、ファイルは全部ハードリンクにして、後でお片づけという手も無くはないが、お片づけのところが面倒じゃない?)
このような場合はやはり、tarファイルの中のパス名を書き換えたい。それもできるだけ機種依存性があったり、「たまたま動く」ような手は使わないようにしつつ、やりたい(バイナリエディタみたいなので強引に書き換えるのはNG)。
はて…どういう手があっただろう…なんか大昔に教わった気がするんだが…
-h (スコア:2)
正規表現的に強力ではないけど、作業ディレクトリでシンボリックリンク張って作るんじゃだめかな?
~/マシン名_日付/log -> /log
とか
Re:-h (スコア:1)
./マシン名_日付/ の部分が複数存在するのに、リンク先が ./log 一つだと、たがいに上書きしちゃいますよね。
それを回避するために tarball 状態の内にパス名を書き変えたいのです。
fjの教祖様
Re:-h (スコア:2)
hオプションは展開パスで格納するので大丈夫なはず
#/は誤植でした ~/マシン名_日付_log -> /log
実はtarが気を利かしてリンク先パスを格納してた?俺爆死?と怖くなったので。手元のubuntuだと
> mkdir real
> touch real/zero.txt
> ln -s real sym
> tar cvf test.tar sym
> tar tvf test.tar
はリンクで
> tar cvhf test.tar sym
は実体になってるはず
#で循環参照つくって爆死したり
bsd/posix tarが挙動違うとかだったら申し訳ありません(汗
pax(1)でしょうか (スコア:2)
SolarisのtarはGNU tarではないSVR4系のものだったと記憶していますが、pax(1)を使うと展開パスを変更できます。
例を探したらhatenaにありました。 [hatena.ne.jp]こんな感じでどうでしょう?
人生は七転び八起き、一日は早寝早起き
Re:pax(1)でしょうか (スコア:1)
おぉうっ!! それだっ!!! そんな感じっっ!!!
ありがとうございますっ
fjの教祖様
Re:pax(1)でしょうか (スコア:1)
今、Fedora17上で pax の man page を見ようとしたら
とあって、「BSDでも使えないか?」という疑問も「Linuxでも使えるのか?」という疑問も一気に氷解しました。
fjの教祖様
Re:pax(1)でしょうか (スコア:2)
人生は七転び八起き、一日は早寝早起き