シンボリックリンクを相対パスで作成したい
ln -sでシンボリックリンクを作成すると、指定したパスがそのままリンク先として記録される。絶対パスで指定すると、ディレクトリごと別の場所へ移動した際にリンク切れを起こす。ディレクトリ構成ごと移動してもリンクを維持したい場合、-rオプションを使う。
ln -s と ln -s -r の違い
同じファイルに対して、絶対パス指定と-rオプション付きでシンボリックリンクを作成し、リンク先の記録のされ方を比較する。まず、リンク元のファイルとリンクを作成するディレクトリを用意する。
$ mkdir -p /tmp/project/bin /tmp/project/data
$ echo "some data" > /tmp/project/data/target.txt
$ cd /tmp/project/bin
/tmp/project/binでシンボリックリンクを作成する。
$ ln -s /tmp/project/data/target.txt link_absolute.txt
$ ls -l link_absolute.txt
lrwxrwxrwx 1 root root 28 Jul 5 06:46 link_absolute.txt -> /tmp/project/data/target.txt
$ ln -s -r /tmp/project/data/target.txt link_relative.txt
$ ls -l link_relative.txt
lrwxrwxrwx 1 root root 18 Jul 5 06:46 link_relative.txt -> ../data/target.txt
-rを付けない場合はリンク先が絶対パス/tmp/project/data/target.txtのまま記録される。-rを付けると、リンクを作成した場所から見た相対パス../data/target.txtに変換されて記録される。
ディレクトリを移動した場合の挙動
プロジェクトディレクトリごと別の場所へ移動して、両方のリンクの状態を確認する。
$ mv /tmp/project /tmp/project_moved
$ cd /tmp/project_moved/bin
$ cat link_absolute.txt
cat: link_absolute.txt: No such file or directory
$ cat link_relative.txt
some data
絶対パスで作成したリンクは、移動前のパス/tmp/project/data/target.txtを指したままのためリンク切れになる。相対パスで作成したリンクは、リンクを起点とした相対的な位置関係が変わっていないため、移動後もそのまま参照できる。
用途
-rは以下のような場面で役立つ。
- プロジェクト一式をディレクトリごと別のマシンや別の場所へコピー・移動する場合
- リポジトリ内で完結させたいシンボリックリンクを作成する場合
絶対パスに依存しないリンクを作成したい場合は-rオプションを使うとよい。
\第一線のプログラマーの行動原理を学べる!/
