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?
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.
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
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ć dols
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.źródło
janos powiedział już, co robić:
I
man 1 stat
mówi:Aby porównać zawartość pliku, możesz użyć:
źródło
find
mastat
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:
Pożyczając od innej odpowiedzi, możemy to zmienić, aby użyć
stat
zamiastxattr
:źródło