Ich weiß, dass ich mit zwei Verzeichnisse rekursiv vergleichen diff -qr
und nur die Unterschiede ausgeben kann. Dies scheint jedoch Dateipositionen innerhalb der Bäume zu vergleichen (z. B. /a/b/file01 != /b/c/file01
).
Ich möchte zwei unterschiedliche Bäume vergleichen und nur eindeutige Dateien als Ergebnis erhalten (unabhängig von ihrer Position im Baum). Im obigen Beispiel file01
würde also als Übereinstimmung betrachtet werden. Ist dies mit möglich diff
, oder muss ich eine verschachtelte find
Schleife ausführen und jede einzelne durchlaufen?
Antwort1
Ich würde find
ein paar Spielereien machen:
Nehmen wir an, die beiden Pfade sind /a und /b:
find /a/ /b/ -exec basename \{} \; | sort | uniq -u
Dies bedeutet also: „Suche alle Dateien in /a und /b und gib ihre Basisnamen aus (d. h., Pfad entfernt), sortiere sie dann und gib dann alle eindeutigen Werte in der Liste aus.“
Wenn Sie dann herausfinden möchten, wo sich diese Dateien in den Verzeichnissen befinden, können wir das Ganze in eine Schleife packen und sie finden:
for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done
Antwort2
Ich glaube nicht, dass das mit möglich ist diff
. Ich nehme an, Sie denken an etwas in der Art von:
find tree1 -type f | while f=`line` ; do diff $f `find tree2 -type f -name "${f##*/}"`; done
tree2
(Dies muss weiter ausgearbeitet werden, um mehrere oder keine Instanzen in jeder Datei von tree1
sowie eingebettete Leerzeichen zu ermöglichen .)
Um den Vorgang zu beschleunigen, können Sie zunächst die Dateiliste speichern tree2
:
find tree2 -type f >tree2.list
find tree1 -type f | while f=`line` ; do diff $f `grep <tree2.list "/${f##*/}$"`; done
Dies bedeutet, dass für jede Datei nicht eine Verzeichnishierarchie durchsucht wird, sondern nur eine einzelne Datei gescannt wird.