👶

tarで絶対パスを使ってアーカイブしてはいけないという話

2022/12/11に公開

経緯

いつもアーカイブ先のディレクトリやファイルのある場所まで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

回避策

  1. 絶対パスでなく相対パスを使う(言わずもがな)
  2. 「-C」オプションを使う
$ tar cfz アーカイブ先 -C アーカイブ元のディレクトリ アーカイブ元

先ほどの例でいうと、以下のようにすれば対応可能

$ tar cfz /home/MQN/test.tar.gz -C /home/MQN dir

所感

今まで、絶対パスだと指定ミスが怖くて、
アーカイブ元まで移動して対応してたから、これまで全然気づかなかった。

Discussion