Verzeichnisse auflisten sollte funktionieren; zB hier ist, was ich in einem Skript verwendet habe (unter der Annahme, Gnu Diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... ignoriert den Inhalt von .svn
und .git
dirs, aber auch einzelne Dateien mit dem Namen *.zip
/ *.gz
/ etc.
Bearbeiten: Um Pfade des Formulars, dir_a/file1
aber immer noch diff
Dateien mit demselben Basisnamen zu filtern , wie z. B. dir_b/file1
oder dir_a/b/file1
, muss eine Liste der Dateien diff
erstellt werden (z. B. mithilfe von find
), und die zu vergleichende Datei muss aus diesen Pfaden abgeleitet werden. zB 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, ohne beispielsweise */a/2.txt
andere Dateien mit dem Namen zu vergleichen 2.txt
. "Finde" einfach alle Dateien außer ONE/a/2.txt
(ein regulärer Ausdruck kann auch hier verwendet werden, wie zum Beispiel .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
die in der Tat ignoriert ONE/a/2.txt
(und TWO/a/2.txt
), vergleicht aber immer noch die anderen genannten Dateien 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", ein beliebiges Verzeichnis mit dem Namen "b" aus und alles andere ist anders. (Anstelle von " -name b
" einfach könnte man auch " -regex '.*/b'
" - not, no trailing "/" verwenden.)
diff
die--exclude
Option ist so beschissen ...