我想創建一個簡單的文件符號連結。
如果我從要創建符號連結的目錄內部運行命令,它會完美地工作:
/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 中正確編寫(和讀取)它很容易。