
考慮到目標已經存在,是否有正確的方法來連結/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
。
首先手動刪除目標。這應該在 Linux 和 Mac 上一致工作。
rm "$target" ln -s "$source" "$target"
如果您使用的是 Linux,則可以使用該
-T
選項。ln -sT "$source" "$target"
如果您使用的是 macOS,則可以使用該
-F
選項。ln -sF "$source" "$target"