web-dev-qa-db-ja.com

相対パス名へのシンボリックリンクを作成する

私がすることができます:

$ 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に渡すことはできますか?

65
Humphrey Bogart

相対パスへのシンボリックリンクを作成すると、例のように絶対パスではなく、相対シンボリックリンクとして保存されます。これは一般的に良いことです。ファイルシステムが他の場所にマウントされている場合、絶対シンボリックリンクは機能しません。

あなたの例がうまくいかない理由は、それがシンボリックリンクの親ディレクトリに相対的であり、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文字を含めることができないという唯一の制限があります)が、シンボリックリンクが使用および解決されているとき、その文字列はへの相対パスとして理解されます。 symlinkの親ディレクトリ(/で始まらない場合)。

66
penguin359

新しいcoreutils(私はcoreutils-8.22-11を使用しています)を使用している場合は、それを行うオプションがあります。

ln --help | grep relative

任意のテキストを保持できます。後で解決される場合、相対リンクは-r、--relativeリンクの場所に相対的なシンボリックリンクを作成します

例えば:

$ 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
25
ptr

申し訳ありません。シンボリックリンクは、リンクを作成したときの場所ではなく、リンクが置かれている場所を基準にしています。この動作にはいくつかの理由がありますが、そのほとんどはリモートファイルシステムのマウントに関係しています。

12
Shadur

symlinks と呼ばれる便利な小さなユーティリティがあり、多くのLinuxディストリビューションに存在します(当初はMark Lordsによって、現在はJ. Brandt Buckleyによって保守されています)。

ディレクトリ内のすべての絶対シンボリックリンクを相対パスに変換するには:

symlinks -c /path/to/directory

残念ながら、単一のリンクを変換するオプションはありません。最初にそれを独自のディレクトリに移動する必要があります。

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

あなたは試すことができます:

ln -s `pwd`/bar.txt /home/beau/bar.txt

しかし、それは絶対パス名へのシンボリックリンクを作成します。あなたのテキストの質問は相対パス名に言及することを尋ねます...

通常、相対パス名は必要なものであり、ln -s あなたにあげる。私が望むのは:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

最も一般的なシェルはパスを拡張するため、相対シンボリックリンクを作成するには、「ソースパス」を引用符で囲む必要があります。

また、-sパラメータは--symbolicを意味します。 lnはデフォルトでハードリンクを作成します。

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

マウントポイントが変更される可能性がないことが確実な場合は、次のようにbashシェルで実行しようとしていることを実現できます。

ln -s `pwd`/bar.txt ~/bar.txt

これは、シンボリックリンクを作成するときにターゲットディレクトリにいることを前提としています。

0
mreff555