シンボリックリンクということは、オリジナルのファイルやフォルダといったものが存在することになる。 そして、シンボリックリンクはファイルやフォルダに対してのみではなく、シンボリックリンクに対しても作成することが出来る。
今回は、このシンボリックリンクとオリジナルファイルの関連を追う方法について紹介する。 なお、サンプル環境は以下のようになっている。
[root@test-centos7 ~]# ls -la $(find /sample* -type l -or -type f)
-rw-r--r--. 1 root root 0 6月 6 17:18 /sample/test.txt
lrwxrwxrwx. 1 root root 16 6月 6 17:19 /sample2/test.txt -> /sample/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample3/test.txt -> /sample2/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample4/test.txt -> /sample3/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample5/test.txt -> /sample4/test.txt
readlinkを用いる
readlinkを用いる事で、シンボリックリンクからオリジナルファイルの場所を調べる事が出来る。
readlink シンボリックリンクのPATH
[root@test-centos7 ~]# readlink /sample5/test.txt
/sample4/test.txt
しかし、オプションなしだとシンボリックリンクの直接のリンク先までしか表示されない。 オリジナルファイルのPATHを表示させるならば、「-f」オプションを利用する。
readlink -f シンボリックリンクのPATH
[root@test-centos7 ~]# readlink -f /sample5/test.txt
/sample/test.txt
これでオリジナルファイルのPATHが確認出来る。 しかし、間に挟まっているシンボリックリンクについての情報を出力させることが出来ないので、その辺りの情報が必要な場合、後述する2つの方法のどちらかを採用すると良いだろう。
nameiコマンドでツリー状に表示させる
nameiコマンドで、階層状にシンボリックリンクをたどっていき、オリジナルファイルのPATHにたどり着く事が出来る。
namei シンボリックリンクのPATH
[root@test-centos7 ~]# namei /sample5/test.txt
f: /sample5/test.txt
d /
d sample5
l test.txt -> /sample4/test.txt
d /
d sample4
l test.txt -> /sample3/test.txt
d /
d sample3
l test.txt -> /sample2/test.txt
d /
d sample2
l test.txt -> /sample/test.txt
d /
d sample
- test.txt
より細かい情報(パーミッションやオーナー、グループなど)を取得する場合は、「-l」オプションを付与する。
namei -l シンボリックリンクのPATH
[root@test-centos7 ~]# namei -l /sample5/test.txt
f: /sample5/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample5
lrwxrwxrwx root root test.txt -> /sample4/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample4
lrwxrwxrwx root root test.txt -> /sample3/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample3
lrwxrwxrwx root root test.txt -> /sample2/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample2
lrwxrwxrwx root root test.txt -> /sample/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample
-rw-r--r-- root root test.txt
なお、シンボリックリンクをたどってオリジナルファイルにたどり着く事はできるのだが、自身に対しシンボリックリンクが作成されているかどうかは調べる事が出来ない。 例えば「/sample4/test.txt」で調べると、オリジナルファイルへたどり着くまでのPATHは表示されるのだが、自分へのシンボリックリンクである「/sample5/test.txt」は表示されない。
[root@test-centos7 ~]# namei -l /sample5/test.txt
f: /sample5/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample5
lrwxrwxrwx root root test.txt -> /sample4/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample4
lrwxrwxrwx root root test.txt -> /sample3/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample3
lrwxrwxrwx root root test.txt -> /sample2/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample2
lrwxrwxrwx root root test.txt -> /sample/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample
-rw-r--r-- root root test.txt
[root@test-centos7 ~]# namei -l /sample4/test.txt
f: /sample4/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample4
lrwxrwxrwx root root test.txt -> /sample3/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample3
lrwxrwxrwx root root test.txt -> /sample2/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample2
lrwxrwxrwx root root test.txt -> /sample/test.txt
drwxr-xr-x root root /
drwxr-xr-x root root sample
-rw-r--r-- root root test.txt
それを調べる場合は、後述するfindコマンドで調べる方法を利用してもらいたい。
findコマンドで全てのシンボリックリンクとオリジナルファイルを表示させる
以前にオリジナルファイルからシンボリックリンクを逆にたどる方法でも記述したが、findコマンドを用いる事で全てのシンボリックリンクとそのオリジナルファイルの情報を取得することが出来る。
ls -la $(find -L /検索対象とするディレクトリ -samefile シンボリックリンクのPATH)
[root@test-centos7 ~]# ls -la $(find -L /{sample*,work,home} -samefile /sample5/test.txt)
-rw-r--r--. 1 root root 0 6月 6 17:18 /sample/test.txt
lrwxrwxrwx. 1 root root 16 6月 6 17:19 /sample2/test.txt -> /sample/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample3/test.txt -> /sample2/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample4/test.txt -> /sample3/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample5/test.txt -> /sample4/test.txt
この方法であれば、自分自身へ作成されたシンボリックリンクの存在についても認識することが出来る。
[root@test-centos7 ~]# ls -la $(find -L /{sample*,work,home} -samefile /sample4/test.txt)
-rw-r--r--. 1 root root 0 6月 6 17:18 /sample/test.txt
lrwxrwxrwx. 1 root root 16 6月 6 17:19 /sample2/test.txt -> /sample/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample3/test.txt -> /sample2/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample4/test.txt -> /sample3/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample5/test.txt -> /sample4/test.txt
[root@test-centos7 ~]# ls -la $(find -L /{sample*,work,home} -samefile /sample3/test.txt)
-rw-r--r--. 1 root root 0 6月 6 17:18 /sample/test.txt
lrwxrwxrwx. 1 root root 16 6月 6 17:19 /sample2/test.txt -> /sample/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample3/test.txt -> /sample2/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample4/test.txt -> /sample3/test.txt
lrwxrwxrwx. 1 root root 17 6月 6 17:19 /sample5/test.txt -> /sample4/test.txt
ただし、リンクの相互関係は別に順番通りになるわけではなく、基本的には目視での確認になってしまう。 それぞれ一長一短あるので、その状況に合わせて利用してもらいたい。