Czy istnieje narzędzie głębokiego mechanizmu różnicowego dla systemu Linux, które również porównuje atrybuty plików?

17

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?

Michael Gantz
źródło
1
Dostarczone odpowiedzi działają raz na jakiś czas w porównaniu. Nie są one jednak wystarczające do przeprowadzania tego rodzaju porównań wiele razy na godzinę podczas testowania oprogramowania. Mogę być skłonny zmodyfikować kod źródłowy diff, aby uwzględnić te porównania.
Michael Gantz

Odpowiedzi:

7

Zrobiłem to przed użyciem funkcji rsync -aHAX --deletezapamiętywania, aby dodać flagi -ni -i.

Jest to nieco sprzeczne z intuicją, ale proszę o wyrozumiałość. Główne rsyncpolecenie jest tym, czego potrzebujesz, aby zsynchronizować oba katalogi razem. Ale -n -ipowoduje, ż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 lslub 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.

w płomieniach
źródło
2

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 statmó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

źródło
To rozwiązanie nie zapewnia praktycznego rozwiązania. Wyświetlana różnica jest pozbawiona kontekstu i zbyt trudna do odczytania. Szukam czegoś, co może pokazać mi nazwę pliku i co jest w tym innego. Nie ma różnicy w dwóch znaleziskach, co jest zupełnie inną bestią.
Michael Gantz
1
GNU findma statwbudowane 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 /avs /bw ścieżce pliku.
Stéphane Chazelas
0

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ć statzamiast 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
źródło