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 diff
daje 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?)
rsync
skopiowałem dane z prędkością około 150 MB / s, adiff
porównuje tylko z prędkością 60 MB / s ...?rsync
jest szybsze b / crsync
domyślnie nie używa sum kontrolnych do porównywania plików, sprawdza informacje o rozmiarze i dacie. Kiedy używaszrsync -c
wszystkich plików, musisz obliczyć ich sumy kontrolne, co jest uciążliwym zadaniem, dlatego nie jest to ustawienie domyślne.Odpowiedzi:
edycja w celu korekty i przejrzystości opcji - zapomniałem „- krótkie”
i dodaj inne opcje do smaku, w zależności od tego, co porównujesz:
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:
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:
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.
źródło
mv
na 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/file1
jest 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.)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 files
wydaje się, że robi różnicę tylko w przypadku plików niebinarnych ... czy się mylę?diff
daje 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?Oto
diff
raport postępu oparty na liczbie plików: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 -q
drukuj tylko nazwy plików różnią się. nie drukuj faktycznych różnic.diff -s
wypisuje 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.logfile
służy do ładnego wyjścia. W przeciwnym razie dane wyjściowediff
zostaną zmiksowane z linią stanu zpv
.aby uzyskać liczbę plików, użyj następującego polecenia:
Filtruj plik dziennika w poszukiwaniu różnych plików:
Ta odmiana wydrukuje pliki, które różnią się w czasie rzeczywistym, a także zaloguje się wszystko
logfile
:Alternatywnie możesz zalogować tylko te pliki, które są różne:
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:
źródło
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.
źródło
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.
źródło