Das Auflisten von Verzeichnissen sollte funktionieren; z. B. habe ich Folgendes in einem Skript verwendet (unter der Annahme von gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... was den Inhalt von .svn
ignoriert und .git
dirs, aber auch einzelne Dateien namens *.zip
/*.gz
/usw.
Bearbeiten: Um Pfade der Form dir_a/file1
zu filtern aber immer noch diff
Dateien mit demselben Basisnamen, z. B. dir_b/file1
oder dir_a/b/file1
, dann eine Liste von Dateien bis diff
generiert werden müsste (z.B. mit find
) und die von diesen Pfaden abgeleitete zu vergleichende Datei; z. B. gegeben
$ find ONE TWO -type f -print
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt
Sie generieren die Liste der zu vergleichenden Dateien, ausgenommen zum Beispiel */a/2.txt
vergleicht aber immer noch andere Dateien mit dem Namen 2.txt
. "Suchen" Sie einfach alle Dateien außer ONE/a/2.txt
(Hier kann auch ein regulärer Ausdruck verwendet werden, z. B. .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
was tatsächlich ONE/a/2.txt
ignoriert (und TWO/a/2.txt
), vergleicht aber weiterhin die anderen Dateien namens 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Bearbeiten: Oder mehr Spaß mit find
(zusätzlicher Spaß als Übung für den Leser), wählen Sie die Dateien oder Verzeichnisse aus, die Sie ausschließen möchten und dann diff
alles andere:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
Das obige Beispiel schließt die spezifische Datei "{top}/a/2.txt", jedes Verzeichnis mit dem Namen "b" aus und alles andere wird unterschieden. (Statt einfach "-name b
" Sie könnten auch "-regex '.*/b'
verwenden " - Achtung, kein nachgestelltes "/".)
Ich hatte das gleiche Problem, also habe ich einen Patch für diff
erstellt . Der Patch muss noch akzeptiert werden, aber Sie können Ihre eigene Version von diff
erstellen mit dem Patch oder auf Arch Linux mit einem AUR-Paket installieren.
Hier ist der diff
Patch.
Verzeichnis directory/sub-directory
ausschließen , verwende ich
diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory
Obwohl es für einen einzelnen Ausschluss funktionieren sollte, sollte es jedoch nicht für eine lange Ignorierliste wie bei Ihnen möglich sein.