パスワードを忘れた? アカウント作成
5947494 journal
日記

okkyの日記: tarを作る時でも展開するときでもいいが、オリジナルと異なるpath名にしたい。どうするか? 7

日記 by okky

つまりですな。

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)。

はて…どういう手があっただろう…なんか大昔に教わった気がするんだが…

この議論は、okky (2487)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...