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.