私がすることができます:
$ 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
に渡すことはできますか?
相対パスへのシンボリックリンクを作成すると、例のように絶対パスではなく、相対シンボリックリンクとして保存されます。これは一般的に良いことです。ファイルシステムが他の場所にマウントされている場合、絶対シンボリックリンクは機能しません。
あなたの例がうまくいかない理由は、それがシンボリックリンクの親ディレクトリに相対的であり、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の親ディレクトリ(/
で始まらない場合)。
新しい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
申し訳ありません。シンボリックリンクは、リンクを作成したときの場所ではなく、リンクが置かれている場所を基準にしています。この動作にはいくつかの理由がありますが、そのほとんどはリモートファイルシステムのマウントに関係しています。
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
最も一般的なシェルはパスを拡張するため、相対シンボリックリンクを作成するには、「ソースパス」を引用符で囲む必要があります。
また、-s
パラメータは--symbolic
を意味します。 ln
はデフォルトでハードリンクを作成します。
$ ln -s '../../relative_path' path
$ ls -al path
lrwxrwxrwx 1 empjustine empjustine 19 Aug 6 01:38 path -> ../../relative/path
マウントポイントが変更される可能性がないことが確実な場合は、次のようにbashシェルで実行しようとしていることを実現できます。
ln -s `pwd`/bar.txt ~/bar.txt
これは、シンボリックリンクを作成するときにターゲットディレクトリにいることを前提としています。