はじめに
当たり前のことを書いていますが、実は忘れがちなので、個人的な備忘録という意味でも纏めています。
システム構築やデータ移行等で別サーバに纏めてファイルを持っていく場合、複数ファイルを纏めて(かつディレクトリ階層を維持して)圧縮し別サーバへコピー、展開することがあると思います。
展開先に対象のディレクトリが存在している、かつそのディレクトリが実ディレクトリとして存在していれば問題ありませんが、シンボリックリンクの場合はそのリンクが切れてしまいます。
Ubuntuなどの場合、ディレクトリの構造の見た目は同じでも、バージョンによって少し異なります。
例えば、/libディレクトリを見ても、18.04は実ディレクトリとして存在しますが、20.04は/usr/libへのシンボリックリンクとなっています。
この状態で展開先が/libの圧縮ファイルをそのまま展開してしまうと、20.04以降の場合、/libのシンボリックリンクが切れてしまい、標準コマンドが実行できなくなります。
動作確認
Ubuntu22.04の環境で試しに展開先で既にディレクトリが存在しており、それがシンボリックリンクの場合で圧縮ファイルを展開してみます。
なお、動作確認のディレクトリ構成は以下の通りです。
※ libディレクトリはusr/libディレクトリのシンボリックリンクとなっています。
$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
lrwxrwxrwx 1 userA userA 8 Nov 18 21:57 lib -> usr/lib/
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr
$ ls -l ~/usr/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
$ ls -l ~/lib/ # ~/usr/libと同じ
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
ここでgzディレクトリの中にある展開対象の圧縮ファイルとその中身を確認します。
$ ls -l ~/gz/lib.tar.gz
-rw-rw-r-- 1 userA userA 161 Nov 18 21:34 /home/userA/gz/lib.tar.gz
$ tar tf ~/gz/lib.tar.gz
lib/ #展開先がlibディレクトリの直下担っています。
lib/f.txt
lib/e.txt
lib/d.txt
実際に展開先のディレクトリを指定してlib.tar.gzを展開してみます。
$ tar zxf ~/gz/lib.tar.gz -C ~/
$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
drwxrwxr-x 2 userA userA 4096 Nov 18 21:33 lib #シンボリックリンクが消えています。
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr
$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 d.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 e.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 f.txt
このコマンドの結果から、圧縮ファイルを展開するとシンボリックリンクが削除されます。
そのため、もし圧縮ファイルを展開する際に圧縮ファイル内でディレクトリが含まれている場合、展開先がシンボリックリンクになっていないか十分確認するようにしましょう。
おまけ
もしlibが実ディレクトリだった場合は以下のようになります。
$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
drwxrwxr-x 2 userA userA 4096 Nov 18 21:32 lib
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr
$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
$ tar zxf ~/gz/lib.tar.gz -C ~/
$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 d.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 e.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 f.txt
展開後はlibディレクトリの中に元々存在しているファイルと展開後のファイルが両方存在していることがわかります。