Ich suche einen einfachen Befehl, der in Bash verwendet werden kann, um den absoluten und kanonisierten Pfad zu einer Datei unter OS X zu finden (ähnlich wie "readlink -f" unter Linux).
In der folgenden Beispiel-Bash-Sitzung wird ein [fiktives] Dienstprogramm namens "abspath" beschrieben, das das gewünschte Verhalten aufweist:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Wie beim letzten Aufruf von "abspath" im obigen Beispiel wäre es mir lieber, wenn Symlinks nicht automatisch aufgelöst würden, aber ich werde hier nicht zu wählerisch sein.
macos
osx-snow-leopard
bash
shell
Michael Wehner
quelle
quelle
Antworten:
Beispiele:
quelle
Ich glaube nicht, dass es einen Buildin-Befehl gibt, der das macht. Jesse Wilson hat dazu ein Bash-Skript geschrieben:
Es funktioniert jedoch nicht gut für Pfade direkt darunter
/
, z. B./etc
(Drucken//etc
) sowie.
und..
(Drucken/cwd/.
in beiden Fällen). Ich habe versucht, es zu ändern, aber mein unzureichendes Bash-Fu hat mich im Stich gelassen.Hier ist mein Vorschlag:
Speichern Sie als
/usr/bin/abspath
oder so etwas und machen Sie es ausführbar. Beispielausgabe:Wenn Sie eine Symlink-Auflösung wünschen, ändern Sie die
print
Zeile wie folgt:um dies zu bekommen:
quelle
file /usr/bin/xattr
Eine Möglichkeit wäre, nur coreutils zu installieren und zu verwenden
greadlink -f
. Es löst Symlinks auf und funktioniert mit/Foo/
oder~/foo.txt
wenn sie nicht existieren, aber nicht mit,/Foo/foo.txt
wenn/Foo/
sie nicht existieren.Dies löst keine Symlinks auf und funktioniert auch nicht mit
/Foo/foo.txt
.dirs -l
Führt eine Tilde-Erweiterung durch.dirs +0
druckt nur das oberste Verzeichnis, wenn sich andere Verzeichnisse im Stapel befinden.quelle
Ich denke, Sie könnten es entweder mit Python oder Ruby tun.
oder mache daraus einen Befehl mit
quelle
Wenn Sie das File :: Spec-Modul für Perl installiert haben, können Sie dies einfach tun:
quelle
Für Bash / Sh-Skripte können Sie diese rekursive Funktion verwenden:
quelle
__filename
. Das Skript verhält sich momentandirname
sowieso eher so .Installieren Sie die folgende Bibliothek für OSX:
quelle
Wenn die Installation von coreutils nicht möglich ist, werden im Folgenden Kombinationen von Symlinks behandelt. und .. und arbeitet mit Dateien und Ordnern wie GNU realpath:
Aber es unterstützt nicht realpath's --relative-to. Dies würde /programming//a/12498485/869951 erfordern .
quelle
Da die Einschränkung MacOS (zur Zeit OS X) ist, ist PHP standardmäßig verfügbar. Dadurch wird das Stammverzeichnis der Datei zurückgegeben. Entfernen Sie auch
dirname
, um die Datei abzurufen.quelle