it-swarm.com.de

Wie kann ich 'diff -X' dazu bringen, bestimmte Pfade und nicht Dateinamen zu ignorieren?

Tun: diff -r -X <ignore-list> <src-dir> <dest-dir>

scheint nicht zu bewirken, dass diff Einträge in <ignore-list> ignoriert, wenn sie die Form <dir>/<file> haben.

Einträge der Form <file> werden jedoch berücksichtigt. Dies ist ein Problem, da ich möglicherweise mehrere Dateien mit dem Namen <file> in verschiedenen Unterverzeichnissen habe, von denen einige nicht ignoriert werden sollen.

Auch in der Manpage zu diff scheint es nicht viele Informationen zur Mustersyntax zu geben. Soweit ich weiß, ist es nur der Basisname einer Datei, die von diff berücksichtigt wird (siehe http://forums.gentoo.org/viewtopic-t-889788-start-0 .html wenn Sie interessiert sind).

28
Ash

Verzeichnisse auflisten sollte funktionieren; zum Beispiel ist hier, was ich in einem Skript verwendet habe (unter der Annahme, dass Gnu Diff,

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.Zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... der den Inhalt von .svn und .git dirs ignoriert, aber auch einzelne Dateien mit dem Namen *.Zip/*.gz/etc.

Bearbeiten: Um Pfade der Form dir_a/file1 und dennoch diff Dateien mit demselben Basisnamen wie dir_b/file1 oder dir_a/b/file1 zu filtern, dann eine Liste von Dateien an diff müsste generiert werden (z. B. mit find), und die zu vergleichende Datei muss von diesen Pfaden abgeleitet werden. 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, schließen beispielsweise */a/2.txt aus und vergleichen dennoch andere Dateien mit dem Namen 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}"' - {} {} \;  

dabei werden ONE/a/2.txt (und TWO/a/2.txt) zwar ignoriert, die anderen Dateien mit dem Namen 2.txt werden jedoch trotzdem verglichen:

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 zu ausschließen 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 des einfachen "-name b" können Sie auch "-regex '.*/b'" verwenden - beachten Sie, dass kein "/" nachgestellt wird.)

29
michael

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 mit dem Patch erstellen oder unter Arch Linux mit einem AUR-Paket installieren.

Hier ist der diff Patch.

2
Dave Parrish

Um Verzeichnis directory/sub-directory auszuschließen, benutze ich

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Obwohl es für einen einzelnen Ausschluss funktionieren sollte, sollte es für eine lange Ignorierliste nicht möglich sein, wie Sie es haben.

1