指向已存在目錄的符號鏈接

指向已存在目錄的符號鏈接

考慮到目標已經存在,是否有正確的方法來連結/home/user/app/public/home/user/public_html

如果我這樣做ln -s /home/user/app/public /home/user/public_html,我最終會擁有/home/user/public_html/public

我想也可以反轉諸如 之類的操作ln -s /home/user/public_html /home/user/app/public,但是我不確定如何避免/home/user/app/public/public_html最終結果。

答案1

讓我以正確的方式理解您的問題

你的來源是/home/user/public_html,我假設它裡面有文件。並且您想要直接在 中建立到該目錄的連結/home/user/app/public。透過這種方式,您可以執行類似的操作ls /home/user/app/public並查看 上存在的檔案/home/user/public_html

如果這是正確的,那麼您的來源是/home/user/public_html,目標是/home/user/app/public。正確的命令是這樣的:

ln -s /home/user/public_html /home/user/app/public

只需確保/home/user/app/public在輸入命令之前不是有效的目錄或檔案。

答案2

如果我正確理解你的問題,你會想知道如何處理已經存在的目標。如果是這樣的話,有兩種可能的情況。

1)現有目標是一個文件。如果是這種情況,您可以使用“-f”強制建立符號鏈接

2) 現有目標是一個目錄。如果是這種情況,那麼這取決於您目前對 ln 命令的實作。它可以有可用的“-n”參數,這會導致正確處理目錄的符號鏈接,而不是像您所說的那樣複製它們。

參考:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists

答案3

我不打算對此進行詳細討論,因為正確的答案已經被選擇,但ln根本無法以這種方式工作。

另一種解決方案是使用mount而不是ln.我相信在這種情況下正確的命令是:

sudo mount --bind ~/app/public ~/public_html

然而,請注意這樣做的警告:根據我的經驗,mount需要特權,所以你必須sudo這樣做。因此,您不能將其放入,.profile因為這會鎖定您的會話。您可以將其放入腳本中,也可以將其新增至/etc/fstab.我通常不會將綁定安裝添加到fstab,但我相信該條目將是:

/home/user/app/public /home/user/public_html none defaults,bind 0 0

或非常相似的東西。我也非常確定您不能在 中使用相對路徑fstab,因此路徑必須是絕對路徑,正如我在這裡所示的那樣。

答案4

正如 @jotadepicas 和 @Milkmannetje 在評論中提到的,有幾種方法可以解決這個問題。

假設您的來源是$source,目的地是$target

  1. 首先手動刪除目標。這應該在 Linux 和 Mac 上一致工作。

    rm "$target"
    ln -s "$source" "$target"
    
  2. 如果您使用的是 Linux,則可以使用該-T選項。

    ln -sT "$source" "$target"
    
  3. 如果您使用的是 macOS,則可以使用該-F選項。

    ln -sF "$source" "$target"
    

相關內容