Für Version 3.3 oder höher diff
sollten Sie die --no-dereference
Option verwenden, wie in der Antwort von Pete Harlan beschrieben .
Leider unterstützen ältere Versionen von diff
nicht das Ignorieren von Symlinks :
Einige Dateien sind weder Verzeichnisse noch reguläre Dateien: Es handelt sich um ungewöhnliche Dateien wie symbolische Links, spezielle Gerätedateien, Named Pipes und Sockets. Derzeit werden diff
symbolische Links wie normale Dateien behandelt. Andere spezielle Dateien werden wie normale Dateien behandelt, wenn sie auf der obersten Ebene angegeben sind. Beim Vergleich von Verzeichnissen wird lediglich das Vorhandensein dieser Dateien gemeldet. Dies bedeutet, dass patch
Änderungen an solchen Dateien nicht dargestellt werden können. Wenn Sie beispielsweise ändern, auf welche Datei eine symbolische Verknüpfung verweist diff
, wird anstelle der Änderung der symbolischen Verknüpfung die Differenz zwischen den beiden Dateien ausgegeben.
diff
sollte optional Änderungen an speziellen Dateien speziell melden und patch
sollte erweitert werden, um diese Erweiterungen zu verstehen.
Wenn Sie nur eine rsync-Überprüfung durchführen möchten (und vermutlich die fehlenden Informationen korrigieren möchten), können Sie den Befehl rsync einfach ein zweites Mal ausführen. Wenn Sie dies nicht möchten, kann es ausreichend sein, das Verzeichnis zu überprüfen .
Wenn Sie dies wirklich tun möchten, diff
können Sie find
die Symlinks überspringen und diff für jede Datei einzeln ausführen. Übergeben Sie die Verzeichnisse a und b als Argumente:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
oder als Einzeiler:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
Dadurch werden Dateien identifiziert, die sich im Inhalt unterscheiden, oder Dateien, die sich in a, aber nicht in b befinden .
Beachten Sie, dass:
- Da wir Symlinks vollständig überspringen, wird dies nicht bemerken, wenn in b keine Symlink-Namen vorhanden sind . Wenn Sie dies benötigen, benötigen Sie einen zweiten Find-Pass, um alle Symlinks zu identifizieren, und überprüfen Sie dann explizit, ob sie in b vorhanden sind .
- Zusätzliche Dateien in b werden nicht identifiziert, da die Liste aus dem Inhalt von a besteht . Dies ist wahrscheinlich kein Problem für Ihr
rsync
Szenario.