Arbeiten an einer Fedora Constantine Box. Ich suche diff
rekursiv nach zwei Verzeichnissen, um nach Quelländerungen zu suchen . Aufgrund der Einrichtung des Projekts (vor meiner eigenen Beschäftigung mit diesem Projekt! Seufz ) enthalten die Verzeichnisse sowohl Quell- und Binärdateien als auch große Binärdatensätze. Während diffing schließlich in diesen Verzeichnissen funktioniert, würde es vielleicht zwanzig Sekunden dauern, wenn ich die Binärdateien ignorieren könnte.
Soweit ich weiß, hat diff keinen Modus zum Ignorieren von Binärdateien, sondern ein Ignorierargument, das reguläre Ausdrücke innerhalb einer Datei ignoriert . Ich weiß nicht, was ich dort schreiben soll, um Binärdateien zu ignorieren, unabhängig von der Erweiterung.
Ich verwende den folgenden Befehl, aber er ignoriert keine Binärdateien. Weiß jemand, wie man diesen Befehl ändert, um dies zu tun?
diff -rq dir1 dir2
quelle
cmp
stattdiff
, ignoriert keine Binärdateien, sollte aber schneller seinAntworten:
Verwenden Sie möglicherweise
grep -I
(was äquivalent zu istgrep --binary-files=without-match
) als Filter, um Binärdateien zu sortieren.dir1='folder-1' dir2='folder-2' IFS=$'\n' for file in $(grep -Ilsr -m 1 '.' "$dir1"); do diff -q "$file" "${file/${dir1}/${dir2}}" done
quelle
IFS=$'\n'
?Art von Betrug, aber hier ist, was ich verwendet habe:
diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile
Dies vergleicht rekursiv dir1 mit dir2, sed entfernt die Zeilen für Binärdateien (beginnt mit "Binärdateien") und leitet sie dann in die Ausgabedatei um.
quelle
-x
Flag ausschließen. Versuchen Siediff -r -x '*.xml' dir1 dir2
auchman diff
für weitere Informationen.Binary\ files\
durch das entsprechende Wort in Ihrer Sprache. Es sollten die ersten ein oder zwei Wörter sein. Auf Deutsch ist esBinärdateien\
-x
ist auch wiederholbar, wenn Sie mehrere Muster ausschließen möchten . So etwas wie-x '*.ext1' -x '*.ext2' -x 'ext3'
.Ich kam zu dieser (alten) Frage und suchte nach etwas Ähnlichem (Konfigurationsdateien auf einem älteren Produktionsserver im Vergleich zur Standardinstallation von Apache). Das Befolgen des Vorschlags von @ anxlesstost in den Kommentaren
git
ist ausreichend leicht und schnell, so dass es wahrscheinlich einfacher ist als jeder der oben genannten Vorschläge. Kopieren Sie Version 1 in ein neues Verzeichnis. Dann mach:git init git add . git commit -m 'Version 1'
Löschen Sie nun alle Dateien aus Version 1 in diesem Verzeichnis und kopieren Sie Version 2 in das Verzeichnis. Mach jetzt:
git add . git commit -m 'Version 2' git show
Dies zeigt Ihnen Gits Version aller Unterschiede zwischen dem ersten Commit und dem zweiten. Bei Binärdateien wird lediglich angegeben, dass sie sich unterscheiden. Alternativ können Sie für jede Version einen Zweig erstellen und versuchen, diese mit den Zusammenführungswerkzeugen von git zusammenzuführen.
quelle
Wenn die Namen der binären Dateien in Ihrem Projekt ein bestimmtes Muster folgen (
*.o
,*.so
, ...) , wie sie in der Regel tun, können Sie diese Muster in einer Datei speichern , und geben Sie es mit-X
Bindestrich (X).Inhalt meiner
exclude_file
Befehl:
AKTUALISIEREN:
-x
kann stattdessen verwendet werden-X
, um Ausschlussmuster in der Befehlszeile und nicht in einer Datei anzugeben:quelle
-x
dient zum Ausschließen eines Musters in der Befehlszeile, während-X
die Datei angibt, die alle auszuschließenden Muster enthält.Verwenden Sie eine Kombination aus
find
und denfile
Befehl. Dies erfordert, dass Sie einige Nachforschungen über die Ausgabe desfile
Befehls in Ihrem Verzeichnis anstellen. Im Folgenden gehe ich davon aus, dass die Dateien, die Sie unterscheiden möchten, als ASCII gemeldet werden. ODER verwenden Siegrep -v
diese Option, um die Binärdateien herauszufiltern.#!/bin/bash dir1=/path/to/first/folder dir2=/path/to/second/folder cd $dir1 files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1) for i in $files; do echo diffing $i ---- $dir2/$i diff -q $i $dir2/$i done
Da Sie wahrscheinlich die Namen der riesigen Binärdateien kennen, platzieren Sie sie in einem Hash-Array und führen Sie den Diff nur aus, wenn sich eine Datei nicht im Hash befindet.
#!/bin/bash dir1=/path/to/first/directory dir2=/path/to/second/directory content_dir1=$(mktemp) content_dir2=$(mktemp) $(cd $dir1 && find . -type f -print > $content_dir1) $(cd $dir2 && find . -type f -print > $content_dir2) echo Files that only exist in one of the paths echo ----------------------------------------- diff $content_dir1 $content_dir2 #Files 2 Ignore declare -A F2I F2I=( [sqlite3]=1 [binfile2]=1 ) while read f; do b=$(basename $f) if ! [[ ${F2I[$b]} ]]; then diff $dir1/$f $dir2/$f fi done < $content_dir1
quelle
Nun, als grobe Art der Prüfung könnten Sie Dateien ignorieren, die mit / \ 0 / übereinstimmen.
quelle
-x
Flag kann verwendet werden, um Dateien zu ignorieren.