👶
tarで絶対パスを使ってアーカイブしてはいけないという話
経緯
いつもアーカイブ先のディレクトリやファイルのある場所までcdで移動してから、
ディレクトリをアーカイブしていたが、もろもろの事情により面倒だったので、絶対パスで対応しようとした。
環境
RHEL 8.x
結果
下の警告が出て驚いた。
tar: Removing leading `/’ from member name
※(補足)日本語だと下のように出るらしい
tar: メンバ名から先頭の `/' を取り除きます
実際、以下のような感じでアーカイブした場合、
$ tar cfz /home/MQN/test.tar.gz /home/MQN/dir
解凍すると、そこから絶対パスで指定したディレクトリ構造まで作られてカオスなことになる。
上記の例だと、/home/MQN/の下に、さらに以下のディレクトリができる形になる。
/home/MQN/dir
(絶対パスなら)/home/MQN/home/MQN/dir
どうしてこんな挙動をするかというと、絶対パスを指定してアーカイブしたら、
解凍したときに既存のフォルダやファイルを上書きすることをOS側で避けようとするかららしい。
/home/MQN/dir
回避策
- 絶対パスでなく相対パスを使う(言わずもがな)
- 「-C」オプションを使う
$ tar cfz アーカイブ先 -C アーカイブ元のディレクトリ アーカイブ元
先ほどの例でいうと、以下のようにすれば対応可能
$ tar cfz /home/MQN/test.tar.gz -C /home/MQN dir
所感
今まで、絶対パスだと指定ミスが怖くて、
アーカイブ元まで移動して対応してたから、これまで全然気づかなかった。
Discussion