tar: Removing leading `/’ from member name
$ tar cfz ./hoge.tar.gz /home/user/my/dir
とかしようとすると
tar: Removing leading `/’ from member name
という注意が出ます。
これはtar
でまとめようとしている先が/
から始まっている絶対パスになっていることが原因で、
注意が出ることで、このパスの先頭の/
を外してhome/user/my/dir
として扱うよ、
ということを言っています。
何を言っているかというと、この出来たhoge.tar.gz
を解答したとき、この状態だと
このhoge.tar.gz
を他に持っていって解凍すると
$ tar xzf ./hoge.tar.gz
このとき、この作業を行っているディレクトリの下に
./home/user/my/dir
が出来る様になります。つまり/home/user/my/dir
の先頭のスラッシュを外すことで相対パスに変化させていることになります。
これは、もしスラッシュを付けたままの絶対パスであるとすると、
どのディレクトリで作業してもこのファイルを解凍すると
必ず/home/user/my/dir
にファイルが展開されることになり、
これは通常意図されてない動作になっているだろう、ということからです。
-Pオプション
これに対して、-P
(大文字)を与えると/
を保持したままの圧縮ファイルを作ることも出来ます。
$ tar cfz -P ./hoge.tar.gz /home/user/my/dir
この場合、hoge.tar.gzをどこで解凍したとしても
/home/user/my/dir
にファイルが展開されます。
例えばUnixの/etc/XXX
のファイルをコピーして他のサーバーに送りたい、というような場合には使えるかもしれませんが、
そういった場合でも意図せずファイルを上書きしてしまう可能性があるので
直接配置したりしたり、まだscp
やrsync
で送った方が良いとは思います。
そのファイル自体、ふと試しに解凍してみた、という事が起きると問題になる可能性が高いので、 そういったものを作ること自体、よほど理由がない限りは辞めたほうが良いだろう、ということです。
-Cオプション
-C <dir>
を使うとそのディレクトリを親ディレクトリとしてファイルをまとめることが出来ます。
$ tar cfz ./hoge.tar.gz -C / home/user/my/dir
は
$ tar cfz ./hoge.tar.gz /home/user/my/dir
と全く同じhoge.tar.gzを作ります。
もしくは
$ tar cfz ./hoge.tar.gz -C / ./home/user/my/dir
でも同じ。
これは/
が先頭にある絶対パスの場合に逆に上の様に/
を親ディレクトリとし、そこからの
相対パスとしてhome/user/my/dir
を見るように強制変更している、という事実があるからです。
逆に、この様に絶対パス的な感じで保存したい場合、
下手なwarningを出さないためには上の様に-C /
を使い、パス側の先頭のスラッシュを外して
やることが正しい使い方になります。
-C
は指定したディレクトリが親になるので、例えば
$ tar cfz ./hoge.tar.gz -C /home/user/my/ dir
とすれば、出来たhoge.tar.gzを解凍すればdirが直接見える様な内容になります。
-T の様な使い方をしている場合
-T <file>
とするとファイルの中身をまとめる事が出来ますが、
この中身が絶対パスで書かれていても上の様な注意が出ます。
これは外側からどうこう出来ないので、ファイルの中のリストの先頭の/を外す(もしくは.
をつけて./home/...
みたいな感じの相対パス的な感じにする)ようにして
かつ-C /
を指定する、という事をする必要があります。