私はこれを行うことができます:
$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt
しかし、私はこれを行うことができるようにしたいです:
$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
可能ですか?どういうわけか相対パス名を解析してに渡すことはできますかln
?
答え1
相対パスへのシンボリックリンクを生成すると、例に示すような絶対シンボリックリンクではなく、相対シンボリックリンクとして保存されます。これは一般的に良いことです。ファイルシステムが他の場所にマウントされると、絶対シンボリックリンクは機能しません。
あなたの例がうまくいかないのは、ln
実行場所ではなくシンボリックリンクの親ディレクトリと比較しているからです。
あなたはできます:
$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
またはその問題について:
$ cd foo
$ ln -s foo/bar.txt ../bar.txt
ln -s
次の最初の引数がシンボリックリンクのターゲットとして保存されることを認識することが重要です。すべての文字列にすることができますが(空にすることはできず、NUL文字を含めることはできないという唯一の制限)、シンボリックリンクを使用して解析すると、文字列はシンボリックリンクの親ディレクトリへの相対パスとして理解されます。 hourで始まらない/
。)
答え2
最新のcoreutilsを使用している場合(私はcoreutils-8.22-11を使用しています)、次のオプションがあります。
ln --help | grep relative
can hold arbitrary text; if later resolved, a relative link is
-r, --relative create symbolic links relative to link location
たとえば、
$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
lrwxrwxrwx 1 ptr ptr 4 aug 25 17.02 /tmp/test/to -> from
答え3
申し訳ありません。そのような機能はありません。シンボリックリンクは、リンクが作成された場所ではなく、リンクが配置されている場所に基づいています。これらの動作にはいくつかの理由があり、そのほとんどはリモートファイルシステムのマウントに関連しています。
答え4
最も一般的なシェル拡張パスは相対シンボリックリンクを生成することであるため、「ソースパス」を引用する必要があります。
また、-s
パラメータは基本的に--symbolic
ハードln
リンクが作成されることを意味します。
$ ln -s '../../relative_path' path
$ ls -al path
lrwxrwxrwx 1 empjustine empjustine 19 Aug 6 01:38 path -> ../../relative/path