редагування для виправлення та чіткості опції - я забув '--brief'
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, --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 буде читати кожен байт оригіналу та копії та повідомляти про файли, однакові.
Формат різного виходу визначається POSIX, тому він досить портативний. Ви можете додати щось на кшталт:
| трійник-розріз.1 | grep -v -Ee "Файли. * і. * ідентичні"
Ви можете використовувати chksums чи хеші, але тоді вам доведеться тримати їх синхронізацію з файлами дерев, так що ви все одно повернетесь до читання кожного байта кожного файлу.
EDIT - занадто довго, щоб бути коментарем у відповідь на:
файли понад 10 Гб не підтверджуються
Ви можете спробувати цю різну опцію: --speed-large-файли
Можливо, що diff, який ви використовуєте, не справляється з дуже великими файлами (більшими, ніж системна пам'ять, наприклад), і таким чином повідомляє про відмінності між файлами, які насправді однакові.
Я думав, що є -h варіант або 'bdiff', який краще працює на великих файлах, але я не можу знайти його у Fedora. Я вважаю, що параметри --speed-large-файлів є спадкоємцем параметра "-h" "напівсердечне порівняння".
Іншим підходом було б повторити використану вами команду rsync з '-vin' (багатослівний, детальний, no_run). Це повідомило б про будь-які відмінності, які знайде rsync - і таких не повинно бути.
Щоб перемістити деякі файли, ви шукаєте сценарій на кшталт:
if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv "$dir2/$path" "$target"
fi
але я не рекомендую цього робити. Основне питання - "як я можу бути впевненим, що rsync правильно скопіював ієрархію файлів?" і якщо ви можете продемонструвати собі, що rsync працює добре, за допомогою diff або іншого інструменту, то ви можете просто покластися на rsync, а не працювати над цим.
rsync -vin порівнюватиме залежно від будь-яких інших варіантів. Я вважав, що за замовчуванням встановлено контрольну суму, але ви праві, -c або --checksum для цього потрібно.
Утиліта diff дійсно призначена для файлів рядків тексту, але вона повинна повідомляти "однакові" недоліки для двійкових файлів.
Короткий опис повинен придушити будь-який вихідний вміст файлу - мої вибачення за те, що раніше його не помітили - він був напівзахований у потворному сценарії.