シンボリックリンクの絶対パス→相対パス変換する symlinks


シンボリックリンクの絶対パス→相対パス変換

シンボリックリンクの宛先は、以下のように絶対パスと相対パスの両方ともできる。絶対パスから相対パスにしたい。

絶対パスの場合:

% cd /tmp
% ln -s /tmp/foobarbaz hogehugapiyo
% ls -l hogehugapiyo
lrwxrwxrwx. 1 cat-in-136 cat-in-136 14 Sep 23 10:38 hogehugapiyo -> /tmp/foobarbaz

相対パスの場合(一から作る場合):

% ln -s foobarbaz hogehugapiyo
% ls -l hogehugapiyo
lrwxrwxrwx. 1 cat-in-136 cat-in-136 9 Sep 23 10:32 hogehugapiyo -> foobarbaz

絶対パス→相対パスの変換をするには、symlinks なるユーティリティを使えばできる。下記の通り、パッケージが提供されている:

まず -t オプションで変更前をプレビューできる。引数の . はカレントディレクトリ以下のシンボリックリンクを対象にすることを示している。

% symlinks -t .
absolute: /tmp/hogehugapiyo -> /tmp/foobarbaz
changed:  /tmp/hogehugapiyo -> foobarbaz

実際に変更するには、-t のかわりに -c を使う。

% symlinks -c .
absolute: /tmp/hogehugapiyo -> /tmp/foobarbaz
changed:  /tmp/hogehugapiyo -> foobarbaz
% ls -l hogehugapiyo
lrwxrwxrwx. 1 cat-in-136 cat-in-136 9 Sep 23 10:47 hogehugapiyo -> foobarbaz

なお、symlinks は、-r で指定ディレクトリ以下を再帰で変換してくれる。これを使えば、ディレクトリが入り組んだところで相対パスでシンボリックリンク貼りたい場合、一旦絶対パスでシンボリックリンク貼ってから symlinks で変換すれば間違いも少なくなるだろう。

% cd /tmp
% mkdir -p foo/bar/baz
% ln -s /tmp/foo foo/bar/baz/foo
% symlinks -cr foo
absolute: /tmp/foo/bar/baz/foo -> /tmp/foo
changed:  /tmp/foo/bar/baz/foo -> ../../../foo

注意点。

  • 変換対象がディレクトリに限るので、あるディレクトリの特定のシンボリックリンクのみ変換ということができない
  • -t でテスト実行したときの表示と -c で実際に実行した時とで表示されるログメッセージに差がない。
  • symlinks 単体では絶対パス→相対パスに特化していて、相対パス→絶対パスへの変換はできない。

いろいろと微妙なところがあるけれどまぁいいユーティリティだと思います。