Gibt es ein Linux-Tool wie diff, das rekursiv Dateien und Verzeichnisse vergleicht, aber zusätzlich auch: erweiterte Attribute, acls, se-Kontexte?
Gibt es ein Linux-Tool wie diff, das rekursiv Dateien und Verzeichnisse vergleicht, aber zusätzlich auch: erweiterte Attribute, acls, se-Kontexte?
Antworten:
Ich habe dies getan, bevor ich mich daran rsync -aHAX --delete
erinnere, die Flags -n
und hinzugefügt zu haben -i
.
Dies ist ein wenig eingängig, aber ertragen Sie es mit mir. Der Hauptbefehl rsync
ist das, was Sie benötigen würden, um die beiden Verzeichnisse miteinander zu synchronisieren. Aber -n -i
es 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 ls
oder ä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.
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 stat
sagt:
%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
find
hat die Funktionen von GNU stat
eingebaut (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 /a
vs /b
im Dateipfad unterscheiden.
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 , stat
statt 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