Kann GNU Diff nur Dateinamen in verschiedenen Ordnerstrukturen rekursiv vergleichen?

Kann GNU Diff nur Dateinamen in verschiedenen Ordnerstrukturen rekursiv vergleichen?

Ich weiß, dass ich mit zwei Verzeichnisse rekursiv vergleichen diff -qrund 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 file01würde also als Übereinstimmung betrachtet werden. Ist dies mit möglich diff, oder muss ich eine verschachtelte findSchleife ausführen und jede einzelne durchlaufen?

Antwort1

Ich würde findein 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 tree1sowie 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.

verwandte Informationen