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


64

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

$ 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ますか?


しかし、記述された動作で解決される問題は何ですか?
forcefsck

圧縮されたフォルダーをダウンロード用に提供し、フォルダーのファイルの一部をシンボリックリンクする方法について、コピー&ペースト可能な指示を出したいとします。
ハンフリーボガート

2
ln -s $(pwd)/bar.txt ~/またはインストールスクリプトを含めます。
forcefsck

2
リンクには、実際にコマンドラインで使用する名前が保存されます。その名前のファイルへの解決は、リンクの場所に関連して行われます。使用する必要がありますln -s foo/bar.txt /home/beau/bar.txt
pqnet 14

回答:


62

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

サンプルが機能しない理由は、シンボリックリンクの親ディレクトリに相対的で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文字を含めることはできないという唯一の制限があります)が、シンボリックリンクが使用および解決されるとき、その文字列はシンボリックリンクの親ディレクトリ(先頭がでない場合/)。


2
いいですね。私が自分の答えを入力しているときに、あなたはこれに答えました。:)
シャドゥール

私はわずかに異なる質問がありました-これは完全に答えます。シンボリックリンクでホームディレクトリを参照する方法を知りたかったので、あるユーザーから別のユーザーにホームディレクトリを転送したときに機能します。何かがうまくいくかどうかはわかりませんでした~
ジョー

「その文字列は、シンボリックリンクの親ディレクトリへの相対パスとして理解されます」-これはすべてを説明します!
Bojan Komazec

24

新しい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

うーん、私にとってはそのようなオプションはないよう-rです。ただし、Macを使用します。
ivkremer

1
@ivkremer coreutils> = 8.16(ソース:superuser.com/a/837935/403979
-DJCrashdummy

相対フラグを使用すると、私が経験していた「シンボリックリンクのレベルが多すぎる」という問題を解決できるように思えました。
Vix

12

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


7

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

ありがとう。githubで利用可能なシンボリックリンク。J. Brandt Buckleyが管理。v1.4.3
エフゲニーVereshchagin

3

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

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

ただし、絶対パス名へのシンボリックリンクを作成します。あなたのテキストの質問は、相対パス名の言及を求めています...

通常、相対パス名はあなたが望むものでありln -s、あなたに与えるものです。私はあなたが欲しいと思う:

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

1

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

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

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

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

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.