2011-03-09 66 views
37

我創建了一個符號鏈接:無法覆蓋符號鏈接RedHat Linux上

sudo ln -s /some/dir new_dir 

現在我要覆蓋符號鏈接指向一個新的位置,它不會覆蓋。我曾嘗試:

sudo ln -f -s /other/dir new_dir 

我總能sudo rm new_dir,但我寧願有它相應的,如果可能的覆蓋。有任何想法嗎?

回答

60
ln -sfn /other/dir new_dir 

適合我。 -n不解引用目標符號鏈接。

+1

好點。從手冊頁:'-h如果target_file或target_dir是符號鏈接,請不要關注它。這對於使用-f選項非常有用,可以替換可能指向目錄的符號鏈接。「# – redent84 2011-03-09 21:37:46

+1

'-n'等效於'-h'(至少在MacOS X上) – redent84 2011-03-09 21:39:10

9

您可以創建它,然後移動它:

sudo ln -f -s /other/dir __new_dir 
sudo mv -Tf __new_dir new_dir 

編輯:缺少-Tf,治療目錄作爲一個常規文件,並且不提示進行覆蓋。

這樣你會覆蓋它。

1

由於從mikeytown2s評論鏈接被打破,我將解釋爲什麼redent84s answer更好:

雖然

ln -sfn newDir currentDir 

做工作,它不是一個原子操作,你可以看到與strace:

$ strace ln -snf newDir currentDir 2>&1 | grep link 
unlink("currentDir")   = 0 
symlink("newDir", "currentDir") = 0 

這是很重要的,當你有一個web服務器的根指向該符號鏈接。它可能會導致錯誤,而符號鏈接被刪除並重新創建 - 即使在微秒的時間範圍內。

以避免錯誤使用,而不是:

$ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir 

這將創建一個臨時鏈接和後覆蓋currentDir在一個原子操作