Shell

獲取兩條路徑之間的相對連結

  • March 15, 2021

假設我有兩條路徑:<source_path><target_path>. 我希望我的 shell (zsh) 自動找出是否有一種方法可以將<target_path>from表示<source_path>為相對路徑。

例如讓我們假設

  • <source_path>/foo/bar/something
  • <target_path>/foo/hello/world

結果將是../../hello/world

為什麼我需要這個:

我需要盡可能創建一個從<source_path><target_path>使用相對符號連結的符號連結,否則當我從 Windows 訪問網路上的這些文件時,我們的 samba 伺服器無法正確顯示文件(我不是系統管理員,並且不要無法控制此設置)

假設<target_path><source_path>是絕對路徑,以下創建一個指向絕對路徑的符號連結。

ln -s <target_path> <source_path>

所以它不適合我的需要。我需要為數百個文件執行此操作,所以我不能手動修復它。

有沒有可以解決這個問題的 shell 內置外掛?

您可以使用該symlinks命令將絕對路徑轉換為相對路徑:

/tmp$ mkdir -p 1/{a,b,c} 2
/tmp$ cd 2
/tmp/2$ ln -s /tmp/1/* .
/tmp/2$ ls -l
total 0
lrwxrwxrwx 1 stephane stephane 8 Jul 31 16:32 a -> /tmp/1/a/
lrwxrwxrwx 1 stephane stephane 8 Jul 31 16:32 b -> /tmp/1/b/
lrwxrwxrwx 1 stephane stephane 8 Jul 31 16:32 c -> /tmp/1/c/

我們有絕對連結,讓我們將它們轉換為相對連結:

/tmp/2$ symlinks -cr .
absolute: /tmp/2/a -> /tmp/1/a
changed:  /tmp/2/a -> ../1/a
absolute: /tmp/2/b -> /tmp/1/b
changed:  /tmp/2/b -> ../1/b
absolute: /tmp/2/c -> /tmp/1/c
changed:  /tmp/2/c -> ../1/c
/tmp/2$ ls -l
total 0
lrwxrwxrwx 1 stephane stephane 6 Jul 31 16:32 a -> ../1/a/
lrwxrwxrwx 1 stephane stephane 6 Jul 31 16:32 b -> ../1/b/
lrwxrwxrwx 1 stephane stephane 6 Jul 31 16:32 c -> ../1/c/

參考

嘗試使用realpath命令(GNU 的一部分coreutils>=8.23),例如:

realpath --relative-to=/foo/bar/something /foo/hello/world

如果您使用的是 macOS,請通過安裝 GNU 版本:brew install coreutils並使用grealpath.

請注意,兩條路徑都需要存在才能使命令成功。如果您仍然需要相對路徑,即使其中一個不存在,請添加 -m 開關。

有關更多範例,請參閱在給定目前目錄的情況下將絕對路徑轉換為相對路徑

引用自:https://unix.stackexchange.com/questions/85060