Gibt es eine Möglichkeit, einen rekursiven Unterschied zwischen zwei Verzeichnissen durchzuführen, aber nur Dateien (an ihren jeweiligen Stellen) zu vergleichen, die einem bestimmten Dateinamen oder Dateityp-Prädikat entsprechen?
Zum Beispiel möchte ich tun etwas wie
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... oder noch besser:
diff -r dir-a dir-b -filetype text
Natürlich ist die Verwendung nicht obligatorisch, diff
da ich eine Beschwörung mit nehme find
und -exec diff
möglicherweise auch den Trick mache (ich weiß nur nicht, wie ich im letzteren Fall die komplementären Dateipfade generieren soll).
command-line
find
diff
Marcus Junius Brutus
quelle
quelle
Antworten:
Shell-Skript
differ-r
Dieses Shellscript kann einen rekursiven Unterschied zwischen zwei Verzeichnissen ausführen, jedoch nur Dateien (an ihren jeweiligen Stellen) vergleichen, die einem bestimmten Dateinamen oder Dateitypmuster entsprechen.
Demo
Dateien:
Verwendungszweck:
Laufen
differ-r
:Die ausgeführten
diff
Befehlszeilen werden mit grünem Text gedruckt, und die Ausgabe, wenn keine Übereinstimmung vorliegt, wird mit Standardtext gedruckt (weiß auf schwarz im folgenden Screenshot).rsync
mit FilterWenn Sie keine Ausgabe erhalten müssen, die den Unterschied beschreibt, nur wissen, welche Dateien unterschiedlich sind oder fehlen (damit
rsync
Sie sie kopieren möchten), können Sie die folgende Befehlszeile verwenden.Demo
Wenn Sie eine saubere Ausgabe ohne Kommentarzeilen und ohne Verzeichnisse wünschen, können Sie
grep
die Ausgabe wie folgt ausführen:Shell-Skript
rsync-diff
Dieser Einzeiler kann zum Kernbefehl eines Shellskripts gemacht werden
rsync-diff
.quelle
Da Sie erwähnt haben "Es ist eindeutig nicht obligatorisch, diff zu verwenden",
Dies sollte die Arbeit für Sie tun meld leicht konfigurierbar für welche Art von Dateitypen zu ignorieren:
Eine weitere Alternative wäre, ein einfaches Skript zu schreiben, das von einer weißen Liste auf eine schwarze Liste übertragen wird. Anschließend wird die schwarze Liste mit der
--exclude
Option an den Diff übergeben .quelle
Bei der Shell-unterstützenden Befehlsersetzung können Sie den folgenden Einzeiler verwenden (wie bereits von @JammingThebBits angegeben):
Das funktioniert folgendermaßen:
find
Suchen Sie nach nicht interessierenden Dateien,sed
extrahieren Sie den Basisnamen (die Ausführungbasename
ist extrem langsam, wenn Sie viele Dateien haben) und fügen Sie sie in eine temporäre Datei ein. Diese Datei wird dann an diediff
Anweisung übergeben, sie vom Vergleich auszuschließen (doppelter Ausschluss = Einschluss).Wenn Sie keine Befehlsersetzung haben, fügen Sie die
sed
Ausgabe in eine Datei ein und übergeben Sie sie explizit andiff
.In dem Beispiel, in dem ich nur nach XML- und JAVA-Dateien gesucht habe, ändern Sie sie nach Bedarf, indem Sie sie durch ODER trennen.
quelle