Überprüfen Sie, ob zwei Pfade auf dieselbe Datei verweisen


12

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

Antworten:


6

Wenn zwei Dateien dieselbe Geräte-ID und denselben Inode haben, sind sie dieselbe Datei. Das statKommandozeilen-Tool macht dies leicht zu finden

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

Dies funktioniert für Symlink-Dateien oder Hardlink-Dateien.


5
Um symbolischen Links zu folgen, benötigen Sie stat -L.
Gilles 'SO - hör auf böse zu sein'

Wie @ Gilles sagte, ohne den -L-Schalter können Sie bei einigen Distributionen falsche Ergebnisse erhalten
Olaseni

19

Viele Shells haben einen -efOperator für das testeingebaute (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 -efdas [[ … ]]bedingte Konstrukt verwenden.

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Laut meiner Manpage macht -ef genau das Gleiche wie die Antwort von Rich Homolka.
user13852

2
@ user13852 -efhat 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, statist, wenn Sie keinen Symlinks folgen möchten.
Gilles 'SO - hör auf böse zu sein'

0

Für Softlinks (erstellt mit ln -s) können Sie verwenden realpath. Dies funktioniert jedoch nicht für Hardlinks.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.