Unter Linux kann man mit dem Befehl diff
nach Unterschieden bei Dateien suchen. Ich benutze es, um nach Unterschieden zwischen zwei Modulen zu suchen, die beide kopiert wurden /tmp
.
Beide Module verfügen jedoch über Symlinks, die möglicherweise nicht auf die richtige Datei verweisen, da die Module in das /tmp
Verzeichnis kopiert wurden . Das spielt aber keine Rolle. Ich möchte überprüfen, ob die Symlinks identisch sind.
In einem Modul lautet beispielsweise der Symlink
/home/test/file1
und im anderen lautet der Symlink:
/etc/rc.d/whatever
diff
Jetzt wird ein Fehler ausgegeben, da die Datei im Allgemeinen nicht gefunden werden kann. Aber ich möchte diff
sagen lassen : "Hey, diese Symlinks sind nicht gleich", unabhängig davon, ob die Links auf gültige Dateien verweisen oder nicht.
Frage: Wie ist es möglich diff
, dies zu tun, dh nicht zu versuchen, Links zu folgen, sondern die Links selbst zu unterscheiden?
Seit Version 3.3 unterstützt GNU diff nicht die Dereferenzierung von Symlinks, sondern vergleicht dann die Pfade, auf die sie zeigen.
Installieren Sie GNU diffutils> = 3.3 und verwenden Sie die Option '--no-dereference'. Dafür gibt es keine kurze Option.
Die Diagnose ist stumm, wenn die Pfade gleich sind, oder:
wenn sich die Pfade unterscheiden.
quelle
Mit GNU-Tools:
Genau genommen kann das nicht zwischen einem Symlink, der auf
a
diesen Punkt verweist,b -> c
und einem Symlink, der auf diesen Punkta -> b
verweist, unterscheidenc
, ganz zu schweigen von den Problemen mit Dateinamen, die Zeilenumbrüche enthalten. Dies führt jedoch zu einer besser lesbaren Ausgabe als der robusteren:Dort verwenden wir
//
als Trennzeichen (das sonst in der Ausgabe vonfind
for nicht vorkommen kann%p
) und konvertieren die Zeilenumbruchzeichen in NUL-Zeichen (die bei der Erweiterung von%p
nor nicht vorkommen können%l
).quelle
Wenn ich das richtig verstehe, möchten Sie überprüfen, ob die Symlinks auf dasselbe theoretische Ziel verweisen oder ob die andere Datei auf dieselbe Datei verweist, wenn einer kein Symlink ist. Dies sollte tun, was Sie wollen:
quelle
-m
, nicht-f
. Vielen Dank!-m
./home/test/file1
ein Symlink zu/etc/rc.d/whatever
oder beide ein Symlink zu sind/
, wird gemeldet, dass sie gleich sind. Ich denke, das OP möchte den Unterschied im "Pfad" sehen, der im Symlink gespeichert ist, und nicht, ob sie in dieselbe Datei aufgelöst werden (für die Sie haben[[ a -ef b ]]
).