2011-12-22 56 views
6

哇,我從來沒有真正使用符號連接之前多,但是這真的是令人難以置信:當鏈接在另一個目錄中時,符號鏈接不工作?

bash-3.2$ echo "weird" > original.txt 
bash-3.2$ mkdir originals 
bash-3.2$ mv original.txt originals/ 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ mkdir copies 
bash-3.2$ ln -s originals/original.txt copies/copy.txt 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ ls copies/copy.txt 
copies/copy.txt 
bash-3.2$ ls -l copies/copy.txt 
lrwxr-xr-x 1 zach staff 22 Dec 22 01:23 copies/copy.txt -> originals/original.txt 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ cd copies/ 
bash-3.2$ cat copy.txt 
cat: copy.txt: No such file or directory 

爲什麼我不能在貓的拷貝目錄符號鏈接?

如果我從拷貝/裏面創建符號鏈接,我可以很好地捕捉它。如果我在當前目錄中創建符號鏈接,我也可以很好地捕捉它。如果我在當前目錄中創建符號鏈接,然後將其移動到拷貝/,我會得到「copies/copy.txt:沒有這樣的文件或目錄」。

回答

15

如果您創建了一個符號鏈接的相對路徑,它會將其存儲爲相對符號鏈接。符號鏈接與鏈接所在的位置相關,而不是其創建或打開的位置。


請使用相對於鏈接的絕對路徑或路徑。

變化:

ln -s originals/original.txt copies/copy.txt 

要:

# absolute 
ln -s /path/to/originals/original.txt copies/copy.txt 

# relative 
cd copies 
ln -s ../originals/original.txt copy.txt 
+0

您不需要使用絕對路徑。只要你用一個圓點(這意味着'你當前的目錄路徑')開始你的路徑,你應該是好的。 – adamwong246 2013-07-24 23:47:06

5

您也可以使用相對路徑來實現這一目標。 像

cd copies 
ln -s ../originals/original.txt copy.txt 

這將工作

當你打開它試圖指從拷貝目錄中的文件的符號鏈接,因爲不存在你所得到的錯誤。

當您使用相對或絕對路徑時,此問題將得到解決。

+0

當編寫一個製作符號鏈接的腳本時,有沒有什麼辦法可以指定從哪個目錄創建相對路徑? – user225643 2011-12-22 10:10:42

+0

用腳本你應該去絕對路徑。有一個固定的目錄包含符號鏈接,然後創建與目錄中的任何文件有關的鏈接 – Raghuram 2011-12-22 10:12:27

+0

所有相關的符號鏈接都與鏈接所在的目錄有關。創建鏈接時不需要指向現有文件如你所見)。相對鏈接或絕對的選擇不應該在製作鏈接的鏈接上進行,但是你想要一個相對鏈接還是絕對鏈接。請記住,在創建相對鏈接之後移動相對鏈接會更改它指向的文件的絕對路徑。 請參閱此處進行轉換:http://stackoverflow.com/questions/2564634/bash-convert-absolute-path-into-relative-path-given-a-current-directory – 2011-12-22 16:54:52

1

考慮一個例子,您希望將您的應用程序日誌符號鏈接到其他地方,這可能是一個目錄,它被掛載到一個輔助目錄,其大小不會影響您的服務器停止工作。現在掛載的目錄將作爲你的目標,你應該創建一個符號鏈接到你的日誌目錄的這個目錄。

假設你的應用程序目錄是/ home/ubuntu/my_app,一旦你啓動你的應用程序,它將在你的my_app目錄中生成一個日誌目錄。現在最終目標是將磁盤使用負擔轉移到掛載目錄,並且目前我們的應用程序目錄中沒有我們的日誌目錄。所以先走一步,按照以下步驟:

mkdir /path_to_mounted_directory/log 
ln -s /path_to_mounted_directory/log /home/ubuntu/my_app_log 

這將首先創建一個名爲日誌目錄中安裝段,將您的應用程序日誌映射到這個目錄。您在應用程序日誌文件夾中添加的任何文件都將自動鏈接到掛載的目錄,因此您可以從原始日誌目錄或掛載的文件夾中隨時隨地閱讀這些文件。

相關問題