web-dev-qa-db-ja.com

ln -sでは、特定のディレクトリにいる必要がありますか?

ファイルへの簡単なシンボリックリンクを作成したいと思います。

シンボリックリンクを作成したいディレクトリ内からコマンドを実行すると、完全に機能します。

/path/to/link $ ln -s /path/to/file .

しかし、私が他のディレクトリにいる場合は、毎回壊れたリンクが作成されます。

/any/other/path $ ln -s /path/to/file /path/to/link

ln -s特定のディレクトリにいる必要がありますか、それとも何かが足りませんか? Ubuntu10.04を実行しています。

更新:パスが相対パスか絶対パスかについて混乱してすみません。彼らは相対的であり、彼らの回答でいくつか言及されているように、これが私の問題の原因でした。ありがとう!

3
evanrmurphy

ターゲットと同じディレクトリにいない場合は、絶対パスを使用していることを確認する必要があります。

ln -s foo/bar baz/quux # fails

ln -s ~/foo/bar baz/quux # succeeds
5
sverre

私は使う傾向があります

ln -s $(pwd)/local_file /path/to/link

ローカルファイルをリンクする必要があるとき。

3
clemens

これは私にはいつも直感的ではありません。私はする習慣があります:

ln -s $(readlink -f /path/to/file) /path/to/link

これは機能するはずですが、実際のディスク上のリンクでは相対的ではなくなります。

1

いいえ、そのような要件はありません。

aix@aix:/tmp$ cd /tmp
aix@aix:/tmp$ mkdir test_path
aix@aix:/tmp$ echo test > test_path/file.txt
aix@aix:/tmp$ ln -s /tmp/test_path/file.txt /tmp/test_path/link.txt
aix@aix:/tmp$ cat /tmp/test_path/link.txt
test

パスの入力ミスがないこと、およびすべての場所で絶対パスを使用していることを確認してください(例が示すように)。

0
NPE

それ自体は、実際にはどのディレクトリにいるかではありません。作成するシンボリックリンクについてです。シンボリックリンクは、ファイルを指すパスを含む単なるファイルです。 /文字で始まるパスを含むシンボリックリンク、またはその文字で始まらないシンボリックリンクを作成できます。 ..パスコンポーネントを含むシンボリックリンクと、含まないシンボリックリンクを作成できます。プログラムがシンボリックリンクを解決してターゲットファイルを見つけると、プログラムはパスをシンボリックリンクを含むディレクトリからの相対パスとして解釈します。したがって、シンボリックリンクに必要なパスがあることを確認する必要があります。

これはMatthewFlaschenの答えに似ている1つの方法ですが、ここではrelativeシンボリックリンクを作成します。

/tmp$ mkdir -p spam/eggs/ham
/tmp$ mkdir foo
/tmp$ python -c "import os, sys; print os.path.relpath(sys.argv[1], os.path.abspath(sys.argv[2])), sys.argv[2]" $(readlink -e foo) spam/eggs/ham  | xargs ln -s 
/tmp$ ls -l spam/eggs/ham/foo
lrwxrwxrwx 1 user user 12 2012-02-05 15:12 spam/eggs/ham/foo -> ../../../foo

純粋なBourne/bash Shellでも実行できることは間違いありませんが、Pythonでこれを正しく記述(および読み取り)するのは簡単です。

0
Croad Langshan