
Ich möchte zwei Verzeichnisse rekursiv vergleichen und dabei einen bestimmten String-Ersatz ignorieren.
Beispielsweise enthalten einige Dateien in einem Verzeichnis die Zeichenfolge „abcd“, während in dem anderen Verzeichnis „abcd“ in denselben Dateien in „wxyz“ umbenannt wurde. Ich möchte alle Unterschiede zwischen den beiden Verzeichnissen sehen, außer der Umbenennung von „abcd“ in „wxyz“.
In diesem Fall ist die Ersetzungslänge tatsächlich dieselbe wie die Originallänge („abcd“ und „wxyz“), obwohl eine generische Lösung für unterschiedliche Zeichenfolgenlängen auch interessant wäre.
Wie kann ich das erreichen?
Antwort1
Eine Möglichkeit, dies zu tun, besteht darin, eine der Dateien vorzuverarbeiten (Ihre Frage besagt, dass alle Dateien von Ordner1 möglicherweiseA B C Dund die Dateien von Ordner2 könntenwxyz.
find
Sie können die Dateisuche beispielsweise innerhalb eines der Bäume durchführen,Ordner1, und geben Sie dies an ein Skript weiter.
Innerhalb des Skripts führen Sie die Ersetzung auf der Eingabedatei aus und leiten das Ergebnis an diff weiter.Standardeingabemit der entsprechenden Datei im anderen Baum.
Ich gehe davon aus, dass Sie den Dateisatz in beiden Bäumen haben. Wenn das nicht der Fall ist, können Sie Code hinzufügen, um damit umzugehen (es gibt auch Flags darin, diff
die hilfreich sein könnten).
Eine Mindestversion würde so aussehen (Sie können beispielsweise mehrere Ersetzungen hinzufügen). Beachten Sie, dass Sie auch sicherstellen müssen, dass der Ersetzungscode das tut, was Sie tun müssen (z. B. nur Wörter und keine Teilzeichenfolgen ändern).
find folder1 -type f -printf "%P\n" |
while read myfile
do
sed 's/abcd/wxyz/g' folder1/$myfile | diff -u folder2/$myfile -
done
Es gibt möglicherweise prägnantere Möglichkeiten, aber hier werden die Stellen deutlich gezeigt, an denen Sie etwas Logik hinzufügen könnten.