如何更新符號連結目標(ln -f -s 不起作用)

如何更新符號連結目標(ln -f -s 不起作用)

我在用著

ln -f -s /var/www/html/releases/build1390 應用程式目前

使用新目的地更新符號連結“app-current”。但是,這不起作用,連結“app-current”保留其原始目的地,但是,我沒有收到任何錯誤...

我不想刪除連結並重新建立它,而只是更新現有連結的目標。那可能嗎?

答案1

這對我有用,輸出是什麼strace ln -f -s /var/www/html/releases/build1390 app-current

哦,因為它是一個目錄,您需要添加它-n才能取消引用,這應該可以解決問題。-f確實更方便,因為添加 -f 只會導致它無論如何都取消連結。儘管我猜想在正常加載的系統上它可能會快幾百毫秒。

例如,如果 arf 已經指向 /home:

strace 與-n

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

沒有-n

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

因此,如果沒有-narf,就會取消引用,因此ln將其視為arf,就好像它實際上是一樣/。在您的特定示例中,如果沒有錯誤,我認為您可能在其中創建了一個新的符號鏈接,/var/www/html/releases/build1390 app-current並且想要清理它。

答案2

如果目標是符號鏈接,則可以使用-n--no-dereference來防止目標被取消引用。您也可以使用-T--no-target-directory來確保目標文件將總是被視為常規文件。

這些會產生略有不同的行為,如下例所示。假設src是某個文件,dirlink是目錄的符號鏈接,並且dir是實際目錄。

使用-n

  • ln -sfn src dirlink覆蓋dirlink並將其連結到src
  • ln -sfn src dir建立連結dir/src -> src

使用-T

  • ln -sfT src dirlink覆蓋dirlink並將其連結到src
  • ln -sfT src dir產生錯誤訊息:ln: ‘dir’: cannot overwrite directory

相關內容