Powiedz, że mam dwie ścieżki: <source_path>
i <target_path>
. Chciałbym moją skorupę (zsh), aby automatycznie sprawdzić, czy istnieje sposób, aby reprezentować <target_path>
od <source_path>
jako ścieżkę względną.
Np. Załóżmy
<source_path>
jest/foo/bar/something
<target_path>
jest/foo/hello/world
Wynik byłby ../../hello/world
Dlaczego potrzebuję tego:
Musi Lubię tworzyć dowiązania symbolicznego od <source_path>
celu <target_path>
za pomocą względnego łącza symboliczne ile to możliwe, ponieważ w przeciwnym razie nasz serwer Samba nie pokazuje plik poprawnie, gdy dostęp do tych plików w sieci w systemie Windows (nie jestem sys Administrator, i don” mieć kontrolę nad tym ustawieniem)
Zakładając, że <target_path>
i <source_path>
są ścieżki bezwzględne, co następuje tworzy dowiązanie symboliczne wskazujące na bezwzględną ścieżkę .
ln -s <target_path> <source_path>
więc to nie działa na moje potrzeby. Muszę to zrobić dla setek plików, więc nie mogę tego ręcznie naprawić.
Jakieś wbudowane powłoki, które się tym zajmują?
symlinks
do konwersji linków bezwzględnych na względne.Odpowiedzi:
Możesz użyć
symlinks
polecenia, aby przekonwertować ścieżki bezwzględne na względne:Mamy linki bezwzględne, przekonwertujmy je na względne:
Referencje
źródło
Spróbuj użyć
realpath
polecenia (część GNUcoreutils
; > = 8,23 ), np .:Jeśli używasz systemu macOS, zainstaluj wersję GNU przez:
brew install coreutils
i użyjgrealpath
.Zauważ, że obie ścieżki muszą istnieć, aby polecenie zakończyło się powodzeniem. Jeśli i tak potrzebujesz ścieżki względnej, nawet jeśli jedna z nich nie istnieje, dodaj przełącznik -m.
Aby uzyskać więcej przykładów, zobacz Konwertuj ścieżkę bezwzględną na ścieżkę względną, biorąc pod uwagę bieżący katalog .
źródło
realpath: unrecognized option '--relative-to=.'
:( realpath wersja 1.19realpath
. Jeśli jesteś na MacOS, zainstalować poprzez:brew install coreutils
.realpath (GNU coreutils) 8.26
tam, gdzie obecny jest parametr. Zobacz: gnu.org/software/coreutils/realpath Sprawdź dwukrotnie, czy nie używasz aliasu (np. Uruchom jako\realpath
) i jak zainstalować wersję zcoreutils
.Myślę, że to rozwiązanie Pythona (wzięte z tego samego postu, co odpowiedź @ EvanTeitelman) również jest warte wspomnienia. Dodaj to do
~/.zshrc
:Następnie możesz na przykład:
źródło
sys.argv
. Jeśli wysłany kod jest nieprawidłowy lub można go poprawić, nie krępuj się, dziękuję.Nie ma żadnych wbudowanych powłok, które by to załatwiły. Znalazłem jednak rozwiązanie dotyczące przepełnienia stosu . Skopiowałem tutaj rozwiązanie z niewielkimi modyfikacjami i zaznaczyłem tę odpowiedź jako wiki społeczności.
Możesz użyć tej funkcji w następujący sposób:
źródło
To najprostsze i najpiękniejsze rozwiązanie problemu.
Powinien również działać na wszystkich muszlach typu bourne.
Oto mądrość: absolutnie nie ma potrzeby korzystania z zewnętrznych narzędzi ani nawet skomplikowanych warunków. Kilka podstawień prefiksów / sufiksów i pętla while to wszystko, czego potrzebujesz, aby uzyskać prawie wszystko, co zrobiono na powłokach typu bourne.
Dostępne również przez PasteBin: http://pastebin.com/CtTfvime
źródło
Makefile
, musiałem dodać do wiersza parę podwójnych cudzysłowówpos=${pos%/*}
(i oczywiście średniki i odwrotne ukośniki na końcu każdego wiersza).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Na dodatek zapominasz wspomnieć, że wszystkie ścieżki muszą być absolutne ORAZ/tmp/a/..
Musiałem napisać skrypt bash, aby zrobić to niezawodnie (i oczywiście bez sprawdzania istnienia pliku).
Stosowanie
Zwraca względną ścieżkę źródłową.
przykład:
oba dostają
../../CC/DD/EE
Aby mieć szybki test, możesz uruchomić
wynik: lista testów
BTW, jeśli chcesz użyć tego skryptu bez zapisywania go i ufasz temu skryptowi, masz dwa sposoby na to dzięki bash trick.
Zaimportuj
relpath
jako funkcję bash, wykonując następujące polecenie. (Wymagaj bash 4+)lub wywołać skrypt w locie, jak w przypadku kombinacji curl bash.
źródło