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?


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.