rcmdnk's blog

TAR TARCOM 30周年 Tシャツ M goodenough グッドイナフ 藤原ヒロシ

Linuxなどでtarコマンドを使ってファイルやディレクトリをまとめようとしたとき、 tar: Removing leading '/’ from member namという注意が出る件について。

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のファイルをコピーして他のサーバーに送りたい、というような場合には使えるかもしれませんが、 そういった場合でも意図せずファイルを上書きしてしまう可能性があるので 直接配置したりしたり、まだscprsyncで送った方が良いとは思います。

そのファイル自体、ふと試しに解凍してみた、という事が起きると問題になる可能性が高いので、 そういったものを作ること自体、よほど理由がない限りは辞めたほうが良いだろう、ということです。

-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 /を指定する、という事をする必要があります。

Sponsored Links
Sponsored Links

« HHKBの新バージョン発売!Bluetooth+Type-Sが実現 macOS Catalina 10.15.2(19C57)にアップデート »