Ich habe ein Skript zum rekursiven Erstellen von Symlinks in meinem Ausgangsverzeichnis zu meinem Einstellungsverzeichnis, um die Dateien unter Versionskontrolle zu halten. Ich möchte, dass Dateien übersprungen werden, die bereits über ein übergeordnetes Verzeichnis verknüpft sind. Das heißt, wenn ich diese Dateien / Verzeichnisse habe:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
, wie überprüfe ich, ob ~ / foo / bar und ~ / settings / foo / bar dieselbe Datei sind?
Edit : D'oh, noch ein paar Minuten Suche enthüllten die Antwort :readlink -f $path
linux
symbolic-link
l0b0
quelle
quelle
stat -L
.Viele Shells haben einen
-ef
Operator für dastest
eingebaute (oder dessen Synonym[
), um zu testen, ob zwei Pfade auf dieselbe vorhandene Datei verweisen (über symbolische Links). Dies umfasst bash, dash, pdksh, ksh88, ksh93 und zsh, jedoch nicht POSIX sh. In bash, ksh oder zsh können Sie auch-ef
das[[ … ]]
bedingte Konstrukt verwenden.quelle
-ef
hat den Vorteil, dass es portabler ist (auch etwas schneller, aber nicht so, dass Sie es die meiste Zeit bemerken würden). Zum Beispiel funktioniert es unter * BSD, OSX, BusyBox sowie Linux / Cygwin (GNU). Es ist auch klarer, da es genau das tut, was erforderlich ist. Der einzige Vorteil, den ich beim Anrufen sehen kann,stat
ist, wenn Sie keinen Symlinks folgen möchten.Für Softlinks (erstellt mit
ln -s
) können Sie verwendenrealpath
. Dies funktioniert jedoch nicht für Hardlinks.quelle