Porównaj ogromne katalogi z raportem postępu


13

Właśnie zsynchronizowałem 2 000 000 plików (3 TB) z jednej macierzy RAID na drugą.

Chcę się upewnić, że moje dane są nienaruszone.

rsync -c zajmuje naprawdę dużo czasu.

diff nie pokazuje mi, co robi.

Czy istnieje alternatywa, która (a) jest szybsza i (b) pokaże mi postęp podczas porównywania?

(Jestem na Macu i brew search diffdaje mi apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... czy jeden z nich wykona zadanie?)



Jestem również zdezorientowany, dlaczego rsyncskopiowałem dane z prędkością około 150 MB / s, a diffporównuje tylko z prędkością 60 MB / s ...?
Dan

1
Kopiowanie przy użyciu rsyncjest szybsze b / c rsyncdomyślnie nie używa sum kontrolnych do porównywania plików, sprawdza informacje o rozmiarze i dacie. Kiedy używasz rsync -cwszystkich plików, musisz obliczyć ich sumy kontrolne, co jest uciążliwym zadaniem, dlatego nie jest to ustawienie domyślne.
slm

Tak, ale diff nie kopiuje ... tylko czyta oba pliki; podczas gdy rsync, aby skopiować, musi odczytać każdy bajt, a następnie napisać go. To był rsync od zera, więc kopiował każdy plik.
Dan

Odpowiedzi:


6

edycja w celu korekty i przejrzystości opcji - zapomniałem „- krótkie”

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

i dodaj inne opcje do smaku, w zależności od tego, co porównujesz:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs odczyta każdy bajt oryginału i kopii oraz zgłosi pliki, które są takie same.

Format wyjściowy różnic jest definiowany przez POSIX, więc jest dość przenośny. Możesz dodać coś takiego:

| tee diff-out.1 | grep -v -Ee „Pliki. * i. * są identyczne”

Możesz użyć chksums lub skrótów, ale potem musisz je zsynchronizować z drzewami plików, więc i tak powrócisz do czytania każdego bajtu każdego pliku.

EDYCJA - za długo, aby być komentarzem, w odpowiedzi na:

pliki powyżej 10 GB nie są weryfikowane

Możesz wypróbować tę opcję diff: --speed-large-files

Możliwe, że używany plik różnicowy nie radzi sobie dobrze z bardzo dużymi plikami (na przykład większymi niż pamięć systemowa), a zatem zgłasza różnice między plikami, które są w rzeczywistości takie same.

Myślałem, że istnieje opcja -h lub „bdiff”, która lepiej działała na dużych plikach, ale nie mogę jej znaleźć w Fedorze. Uważam, że opcja --speed-large-files jest następcą opcji „h” porównywania bez przekonania.

Innym podejściem byłoby powtórzenie użytej komendy rsync z „-vin” (verbose, itemize, no_run). Spowoduje to zgłoszenie wszelkich różnic znalezionych przez rsync - i nie powinno ich być.

Aby przenieść niektóre pliki, patrzysz na skrypt podobny do:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

ale nie polecam tego robić. Podstawowe pytanie brzmi: „skąd mogę mieć pewność, że rsync poprawnie skopiował hierarchię plików?” a jeśli potrafisz wykazać, że rsync działa dobrze, używając diff lub innego narzędzia, możesz polegać na rsync, zamiast na nim pracować.

rsync -vin porówna na podstawie innych podanych opcji. Myślałem, że domyślnie jest to suma kontrolna, ale masz rację, wymagana jest opcja -c lub --checksum.

Narzędzie diff naprawdę jest przeznaczone do plików wierszy tekstu, ale powinno zgłaszać „identyczne” wartości dolne dla plików binarnych.

- Brief powinien tłumić wszelkie dane wyjściowe zawartości pliku - przepraszam, że przeoczyłem go wcześniej - został częściowo zakopany w brzydkim skrypcie.


Czy istnieje sposób mvna przeniesienie go do każdego znalezionego pliku do „zweryfikowanego” folderu w katalogu głównym dysku, zachowując pełną ścieżkę? Np. Jeśli /disk1/a/b/c/file1jest identyczny /disk2/a/b/c/file1, to przenieś go do /disk1/verified/a/b/c/file1. Wtedy mogłem skończyć tylko z źle skopiowanymi plikami. (Jak dotąd DUŻO plików przekraczających 10 GB nie weryfikuje, co jest przerażające.)
Dan

Możesz wypróbować tę opcję: - prędkość-duże-pliki
D McKeon

Co to dokładnie robi?
Dan

Jeśli uruchomię rsync -vin- czy robi to porównanie bajt po bajcie lub suma kontrolna? Myślałem, że rsync porównał tylko rozmiar / datę, chyba że dodasz -c. I z tego, co przeczytałem, speed large fileswydaje się, że robi różnicę tylko w przypadku plików niebinarnych ... czy się mylę?
Dan

diffdaje mi wyniki w postaci "Files __ and ___ differ"... i uruchamiam to, sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"aby spróbować wygenerować skrypt do ponownego kopiowania uszkodzonych plików. Ale wynik diff nie jest cytowany, więc nie działa. Czy mogę to zrobić, aby podać mi cytowane ścieżki?
Dan

4

Oto diffraport postępu oparty na liczbie plików:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Będziesz potrzebował pv (przeglądarka potoków): http://www.ivarch.com/programs/pv.shtml

Wyjaśnienie:

  • diff -r porównaj rekursywnie katalog i podkatalogi.
  • diff -qdrukuj tylko nazwy plików różnią się. nie drukuj faktycznych różnic.
  • diff -swypisuje także nazwy plików, które się nie różnią. jest to ważne dla informacji o postępie.
  • pv -l zgłoś postęp na podstawie liczby wierszy.
  • pv -s count szacowany czas do ukończenia na podstawie liczby.
  • Przekierowanie do logfilesłuży do ładnego wyjścia. W przeciwnym razie dane wyjściowe diffzostaną zmiksowane z linią stanu z pv.

aby uzyskać liczbę plików, użyj następującego polecenia:

find dir1 -type f | wc -l

Filtruj plik dziennika w poszukiwaniu różnych plików:

grep -v "^Files .* identical$" logfile

Ta odmiana wydrukuje pliki, które różnią się w czasie rzeczywistym, a także zaloguje się wszystko logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Alternatywnie możesz zalogować tylko te pliki, które są różne:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Uwaga: powyższe polecenia zgłaszają postępy na podstawie liczby plików. Działa to najlepiej, jeśli istnieje wiele małych plików. Jeśli masz kilka dużych plików, nie będziesz się tym dobrze bawić.

Niestety nie znam łatwego sposobu zgłaszania postępów w oparciu o porównywane bajty.


Jeśli możesz znaleźć spokój, porównując metadane (a nie rzeczywistą zawartość plików), możesz użyć rsync. Będzie to znacznie szybsze.

Po więcej szczegółów:


0

Chciałbym użyć jakiejś aplikacji haszującej do sprawdzenia integralności danych. Wiem, że wiele narzędzi do wyszukiwania zduplikowanych plików używa skrótów do identyfikowania duplikatów / nie-duplikatów. Wydaje mi się, że to dochodzenie może być opłacalne.


0

Możesz do tego użyć rdiff-backup . Zainstaluj go na obu serwerach, aby dokonać inteligentnych porównań sum kontrolnych i zsynchronizować to, czego jeszcze nie ma.

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.