ln -s 是否要求您位於某個目錄中?

ln -s 是否要求您位於某個目錄中?

我想創建一個簡單的文件符號連結。

如果我從要創建符號連結的目錄內部運行命令,它會完美地工作:

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

但如果我在任何其他目錄中,它每次都會創建一個損壞的連結:

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

是否ln -s要求您位於某個目錄中,還是我遺漏了某些內容?運行 Ubuntu 10.04。

更新:抱歉,對於路徑是相對路徑還是絕對路徑感到困惑。它們是相對的,正如一些人在回答中提到的那樣,這是我問題的根源。謝謝!

答案1

如果您與目標不在同一目錄中,則必須確保使用絕對路徑。

ln -s foo/bar baz/quux # fails

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

答案2

我傾向於使用

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

當我需要連結本地文件時。

答案3

這對我來說總是不直觀的。我養成了這樣做的習慣:

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

這應該可以工作,但代價是使其在實際的磁碟連結中不相關。

答案4

它本身並不是關於您所在的目錄。這與您建立的符號連結有關:符號連結只是包含指向檔案的路徑的檔案。您可以建立包含以該字元開頭的路徑的符號鏈接/,也可以建立不以該字元開頭的符號連結。您可以建立包含..路徑組件的符號連結和不包含路徑組件的符號連結。當程式解析符號連結以查找目標檔案時,它們會將路徑解釋為相對於包含符號連結的目錄。因此,您只需確保符號連結具有您想要的路徑。

這是一種與 Matthew Flaschen 的答案類似的方法,但這裡做了一個相對的符號連結:

/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 中正確編寫(和讀取)它很容易。

相關內容