Shell
獲取兩條路徑之間的相對連結
假設我有兩條路徑:
<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 開關。
有關更多範例,請參閱在給定目前目錄的情況下將絕對路徑轉換為相對路徑。