Gibt es ein Linux-Deep-Diff-Tool, das auch Dateiattribute vergleicht?

16

Gibt es ein Linux-Tool wie diff, das rekursiv Dateien und Verzeichnisse vergleicht, aber zusätzlich auch: erweiterte Attribute, acls, se-Kontexte?

Michael Gantz
quelle
1
Die gelieferten Antworten sind nur für gelegentliche Vergleiche geeignet. Beim Testen von Software sind sie jedoch nicht ausreichend, um diese Art von Vergleichen mehrmals pro Stunde durchzuführen. Ich könnte geneigt sein, den diff-Quellcode zu modifizieren, um diese Vergleiche aufzunehmen.
Michael Gantz

Antworten:

7

Ich habe dies getan, bevor ich mich daran rsync -aHAX --deleteerinnere, die Flags -nund hinzugefügt zu haben -i.

Dies ist ein wenig eingängig, aber ertragen Sie es mit mir. Der Hauptbefehl rsyncist das, was Sie benötigen würden, um die beiden Verzeichnisse miteinander zu synchronisieren. Aber -n -ies verursacht nicht für die Synchronisierung (dh einen Trockenlauf zu tun) und druckt nur heraus , was es getan hätte und warum. Das Parsen ist nicht fantastisch, aber Sie können den Dateinamen einfach rausholen und per Pipe zu lsoder ähnlichem senden.

Dies wird alles betrachten, einschließlich MTIMES, DATUMS usw., und auch Geräteknoten, Sockets, Named Pipes usw. nicht verfolgen. Die obige Befehlszeile befasst sich auch mit ACLs und erweiterten Attributen. Sie können das, was Sie sehen, anpassen, indem Sie die Optionen auf ändern rsync, es auf ein Gerät mit beschränken -x, das Soft- und Hardlink-Verhalten ändern usw. usw.

abligh
quelle
2

janos hat schon gesagt was zu tun ist:

find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b

diff -u a b

Und man 1 statsagt:

%A     access rights in human readable form
%C     SELinux security context string
%F     file type
%g     group ID of owner
%u     user ID of owner
%s     total size, in bytes
%Y     time of last modification, seconds since Epoch
%n     file name

Zum Vergleichen des Dateiinhalts können Sie Folgendes verwenden:

find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-

as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash

quelle
Diese Lösung bietet keine praktikable Lösung. Das angezeigte Diff ist kontextfrei und zu schwer lesbar. Ich suche nach etwas, das mir einen Dateinamen zeigt und was daran anders ist. Kein Unterschied zwischen zwei Funden, was ein völlig anderes Tier ist.
Michael Gantz
1
GNU findhat die Funktionen von GNU stateingebaut (und ist um Jahrzehnte älter als GNU stat). Sie sollten die Ausgabe auch sortieren, bevor Sie sie unterscheiden. Und du brauchst (cd /a && find . ...)sonst werden sich alle Zeilen wegen /avs /bim Dateipfad unterscheiden.
Stéphane Chazelas
0

Hier ist ein schnelles Bash-Skript, das ich geschrieben habe, um erweiterte Attribute zu vergleichen. Es druckt jeden Dateinamen und dann alle Unterschiede in den Attributen aus:

cd a
export relpath=[path/to/b/from/a]

for filename in $(find .);
do
    echo $filename;
    diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done

Angelehnt an eine andere Antwort, können wir dies ändern zu verwenden , statstatt xattr:

for filename in $(find .);
do
    echo $filename;
    diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done
Aaron Campbell
quelle