Angenommen, ich habe zwei Wege: <source_path>
und <target_path>
. Ich würde meine Shell (zsh) wie automatisch, um herauszufinden , ob es eine Möglichkeit darzustellen , ist <target_path>
aus <source_path>
als relativer Pfad.
Nehmen wir zum Beispiel an
<source_path>
ist/foo/bar/something
<target_path>
ist/foo/hello/world
Das Ergebnis wäre ../../hello/world
Warum ich das brauche:
Ich möchte einen symbolischen Link von <source_path>
zur <target_path>
Verwendung eines Verwandten erstellen symbolischen Link , wann immer möglich, da sonst unser Samba - Server die Datei nicht richtig funktioniert zeigen , wenn ich diese Dateien auf dem Netzwerk von Windows - Zugriff (Ich bin nicht der sys admin, und don‘ keine Kontrolle über diese Einstellung haben)
Unter der Annahme, dass <target_path>
und <source_path>
absolute Pfade sind, wird im Folgenden eine symbolische Verknüpfung erstellt, die auf einen absoluten Pfad verweist .
ln -s <target_path> <source_path>
es funktioniert also nicht für meine bedürfnisse. Ich muss dies für Hunderte von Dateien tun, damit ich es nicht einfach manuell reparieren kann.
Gibt es Shell-Einbauten, die sich darum kümmern?
symlinks
absolute Links in relative konvertieren.Antworten:
Sie können den
symlinks
Befehl verwenden, um absolute Pfade in relative Pfade umzuwandeln:Wir haben absolute Links, konvertieren wir sie in relative:
Verweise
quelle
Versuchen Sie es mit einem
realpath
Befehl (Teil von GNUcoreutils
; > = 8.23 ), zB:Wenn Sie MacOS verwenden, installieren Sie die GNU-Version über:
brew install coreutils
und verwenden Siegrealpath
.Beachten Sie, dass beide Pfade vorhanden sein müssen, damit der Befehl erfolgreich ausgeführt werden kann. Wenn Sie den relativen Pfad trotzdem benötigen, auch wenn einer nicht vorhanden ist, fügen Sie den Schalter -m hinzu.
Weitere Beispiele finden Sie unter Konvertieren des absoluten Pfads in einen relativen Pfad bei einem gegebenen aktuellen Verzeichnis .
quelle
realpath: unrecognized option '--relative-to=.'
:( realpath version 1.19realpath
. Wenn Sie auf macOS sind, installieren Sie über:brew install coreutils
.realpath (GNU coreutils) 8.26
wo der Parameter vorhanden ist. Siehe: gnu.org/software/coreutils/realpath , dass Sie keinen Alias verwenden (z. B. Ausführen als\realpath
) und wie Sie die Version von installieren könnencoreutils
.Ich denke, diese Python-Lösung (aus dem gleichen Beitrag wie @EvanTeitelmans Antwort) ist ebenfalls erwähnenswert. Fügen Sie dies zu Ihrem hinzu
~/.zshrc
:Sie können dann zum Beispiel Folgendes tun:
quelle
sys.argv
. Wenn der veröffentlichte Code falsch ist oder verbessert werden kann, können Sie dies mit meinem Dank tun.Es gibt keine Shell-Builtins, die sich darum kümmern. Ich habe jedoch eine Lösung für Stack Overflow gefunden . Ich habe die Lösung hier mit geringfügigen Änderungen kopiert und diese Antwort als Community-Wiki markiert.
Sie können diese Funktion folgendermaßen verwenden:
quelle
Dies ist die einfachste und schönste Lösung für das Problem.
Es sollte auch auf allen bourne-ähnlichen Shells funktionieren.
Und die Weisheit dabei ist: Es sind absolut keine externen Dienstprogramme oder sogar komplizierten Bedingungen erforderlich. Ein paar Präfix- / Suffix-Substitutionen und eine while-Schleife sind alles, was Sie für bourne-ähnliche Shells benötigen.
Auch über PasteBin erhältlich: http://pastebin.com/CtTfvime
quelle
Makefile
ich der Zeile ein Paar doppelte Anführungszeichenpos=${pos%/*}
(und natürlich Semikolons und Backslashes am Ende von everyline) hinzufügen.relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Außerdem vergessen Sie zu erwähnen, dass alle Pfade absolut UND kanonisiert sein müssen (dh/tmp/a/..
nicht funktionieren)Ich musste eine schreiben Bash-Skript , um dies zuverlässig zu tun (und natürlich ohne die Existenz der Datei zu überprüfen).
Verwendung
Gibt einen relativen Quellpfad zurück.
Beispiel:
beide bekommen
../../CC/DD/EE
Um einen schnellen Test zu haben, können Sie laufen
Ergebnis: eine Liste von Tests
Übrigens, wenn Sie dieses Skript verwenden möchten, ohne es zu speichern, und Sie diesem Skript vertrauen, haben Sie zwei Möglichkeiten, um dies mit einem Bash-Trick zu erreichen.
Importieren Sie
relpath
als Bash-Funktion, indem Sie dem Befehl folgen. (Benötige Bash 4+)oder rufen Sie das Skript spontan auf, wie bei einer Curl-Bash-Kombination.
quelle