Czy istnieje narzędzie Linuksa, takie jak diff, które rekurencyjnie porównuje pliki i katalogi, ale z dodatkiem porównania: atrybutów rozszerzonych, kontekstów acl, se?
Czy istnieje narzędzie Linuksa, takie jak diff, które rekurencyjnie porównuje pliki i katalogi, ale z dodatkiem porównania: atrybutów rozszerzonych, kontekstów acl, se?
Odpowiedzi:
Zrobiłem to przed użyciem funkcji rsync -aHAX --delete
zapamiętywania, aby dodać flagi -n
i -i
.
Jest to nieco sprzeczne z intuicją, ale proszę o wyrozumiałość. Główne rsync
polecenie jest tym, czego potrzebujesz, aby zsynchronizować oba katalogi razem. Ale -n -i
powoduje, że NIE synchronizuje się (tj. Wykonuje próbę na sucho) i po prostu drukuje, co by zrobił i dlaczego. To nie jest fantastyczne parsowanie, ale możesz łatwo pobrać nazwę pliku i przesłać do ls
lub podobnego.
Spowoduje to obejrzenie wszystkiego, w tym mtimes, daty itp., A także nieprzestrzeganie węzłów urządzeń, gniazd, nazwanych potoków itp. W powyższym wierszu polecenia są również wyświetlane listy ACL i rozszerzone atrybuty. Możesz dostosować to, na co patrzysz, zmieniając opcje rsync
, ograniczając je do jednego urządzenia -x
, zmieniając zachowanie miękkiego i twardego łącza itp.
janos powiedział już, co robić:
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
I man 1 stat
mówi:
%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
Aby porównać zawartość pliku, możesz użyć:
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
ma stat
wbudowane funkcje GNU (i poprzedza statystyki GNU o dekady). Będziesz także chciał posortować dane wyjściowe przed różnicowaniem. W (cd /a && find . ...)
przeciwnym razie wszystkie linie będą się różnić ze względu na /a
vs /b
w ścieżce pliku.
Oto krótki skrypt napisany przeze mnie, aby porównać rozszerzone atrybuty. Drukuje każdą nazwę pliku, a następnie wszelkie różnice w atrybutach:
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
Pożyczając od innej odpowiedzi, możemy to zmienić, aby użyć stat
zamiast 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