Linuxで相対シンボリックリンクを作成するにはどうすればよいですか?


回答:


78
  1. リンクを配置するディレクトリに移動します
  2. コマンドを実行する ln -s ../some/other/file linkname

指定したパスはファイルとともに保存されます。ファイルにアクセスすると、保存されたパスが検索され、ファイルに対して相対的に展開されます。リンクを作成したときにどのディレクトリにいたかはわかりません。


23
いいえ、あなたはしません。現在のディレクトリではなく、リンク名に関連する場所を指定することを確認する必要があります。
イグナシオバスケス-エイブラムス

5
理解を助けるために:指定したパスはファイルとともに保存されます。ファイルにアクセスすると、保存されたパスが検索され、ファイルに対して相対的に展開されます。リンクを作成したときにどのディレクトリにいたかはわかりません。
マリアン

2
ln -s ../some/other/file /some/dir/linkname
完全

1
代わりに、再びディレクトリとを下って行くと、あなたはまた、単に行うことができますln -s ./file linknameので、.現在のディレクトリを指します。
-pduersteler

1
ln -s somedir/original-dir link-name動作しません。link-name無効なリンクを含む名前のディレクトリを作成します。動作するコマンドは次のln -sr somedir/original-dir link-name
とおり

28

GNU coreutilsのln(> = 8.16)の最近のバージョンは、--relative(または-r)オプションをサポートします。これはln -s、2つの絶対パスまたは相対(作業ディレクトリに関して)パスで呼び出すことができることを意味します。シンボリックリンクに書き込まれます。


2
ありがとう。この-rオプションは、クロスコンパイルを行い、ビルドホストでは絶対パスが必要ですが、ターゲットでは相対パスが必要な場合に役立ちます。
ロバートカルホーン

rdfindは、絶対的なだけでなく、理由もなくディレクトリからバックトラックするいくつかの本当に悪いシンボリックリンクを生成する可能性があります。ln -r -s targetfile myaliasあなたがそれを修正するのを手伝うことができます
レイ・フォス

2

理解する必要があるのは、基本的に、シンボリックリンクはファイルを含むディレクトリエントリのようなものではなく、テキストファイルのようなものだということです。もしあなたが

echo ../poo >/file/name

それは非常に似ています

ln -s ../poo /file/name

システムは、/file/../poo存在するかどうかをまったく気にしません。シンボリックリンクに入れられるのは単なるテキストです。何かがシンボリックリンクを開こうとすると、システムはそれを解決しようとします。

ファイル名を補完するシェルを使用している場合、この機能は、完全に別のディレクトリのシンボリックリンクのターゲットとして使用することになっても、現在の作業ディレクトリに関連するファイル名を補完できるため、混乱を招く可能性があります。


これはいくつかのシステムコールによって悪用されています。たとえば、特定のシステムファイルをシンボリックリンクし<、システムがメモリを割り当てる方法を変更できるようにするために使用されたBSDなどがあります。もちろん<、そのディレクトリに名前の付いたファイルはありません。それは、特定のプラットフォームの通常のテキストファイルに対して魅力的なプロパティを持つ、非常に小さなファイルのようなものを作成するための安価な方法です。
トリプリー

そのリンクは現在無効です。man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5を試してみてくださいしかし、OpenBSDの最近のバージョンでの動作はあまりカラフルではありません。
トリプリー

0

相対リンクは、OS Xでは私にとって扱いにくいものでした。つまり、

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

両方とも機能しませんでした(何かが作成されましたが、ディレクトリではありませんでした)。絶対パスを使用して目的のリンクを作成しました。

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

これは実行可能なソリューションであるため、コメントである必要はありません。これは別の答えとして残ることができます。
-slhck

1
相対リンクでの最初の試行は単純に間違っているため、機能していません。相対リンクのしくみを誤解しました。それについて特に難しいことは何もありません(OS Xを使用している場合でも)。おそらく、リンクを作成するときに作業ディレクトリを変更することについて話している他の回答に見当違いになったのでしょう。それは単にリンクを正しく行うのを簡単にするためであり、決して必要ではありません。現在のディレクトリに対する相対パスではなく、リンクのディレクトリに対する相対パスを定義します。これはあなたがln -s Dropbox/git/codyhess/bin ~/bin
Timo

また、誰かが絶対リンクを行うことができるという言葉が「実行可能なソリューション」を構成するという世界で相対リンクを作成する方法を具体的に求めているとき、@ slhck?具体的にはOPの質問に答えていないため、ソリューションの正反対であり、ソリューションではありません。これはコメントや回答ではなく、「相対リンクがどのように機能するか(Macユーザーが理解できるように説明されているか)」という質問であるべきです。このMacユーザーが十分に説明してくれることを願っています。:)
ティモ

@TimoLehtoおそらく、元の作者(Cody Hess)にコメントを送りたいと思うでしょう。投稿を編集しただけです。
-slhck

@slhck、あなたは解決策を「実行可能」とみなし、あなたのコメントは、答えに「答えではない」というフラグを立てたい(あなたがフラグが受け入れられます)。
ティモ

0

相対パスを使用してシンボリックリンクを作成する方法を詳細に説明したいだけです(詳細な例を使用)。

コメントでIgnacio Vazquez-Abramsが言及したように、現在のディレクトリではなく、シンボリックリンクが作成される場所に相対的なファイル/フォルダの場所を指定する必要があります。

あなたにはある/usr/share/nginx/html/_src/learn シンボリックリンクを作成します。あなたcoding/usr/share/nginx/html

相対シンボリックリンク(理論)を作成します。

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

実際の相対シンボリックリンクを作成します。

sudo ln -s ./_src/learn/coding ../../coding

詳細(同じ例)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.