GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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.


Linux
  1. Wie bringt man Ibus dazu, ~/.xcompose nicht zu ignorieren?

  2. Wie kann ich überprüfen, ob eine Datei vorhanden ist, und einen Befehl ausführen, wenn dies nicht der Fall ist?

  3. Wie macht man eine Datei spärlich?

  4. Wie kann ich eine bestimmte Datei von einem Linux-Terminal aus finden?

  5. So berühren Sie eine Datei und mkdir bei Bedarf in einer Zeile

Dateipfade verstehen und wie man sie unter Linux verwendet

Wie man mit Hardlinks und Softlinks unter Linux arbeitet

Linux + Wie ignoriert (filtert) man Dateien mit Leerzeichen?

Wie kann ich zwei Abschnitte derselben Datei unterscheiden?

Wie mache ich eine Datei NICHT änderbar?

Warum funktioniert mein Crontab nicht und wie kann ich es beheben?