редактировать для исправления и ясности опций - я забыл '--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 будет читать каждый байт оригинала и копии, а также сообщать файлы, которые совпадают.
Формат вывода diff определяется POSIX, поэтому он довольно переносим. Вы можете добавить что-то вроде:
| тройник различий.1 | grep -v -ee 'Файлы. * и. * идентичны'
Вы можете использовать chksum или хэши, но тогда вам нужно будет синхронизировать их с деревьями файлов, чтобы вы все равно вернулись к чтению каждого байта каждого файла.
РЕДАКТИРОВАТЬ - слишком долго, чтобы быть комментарием, в ответ на:
файлы размером более 10 ГБ не проверяются
Вы можете попробовать эту опцию diff: --speed-large-files
Возможно, что используемый вами diff не справляется с очень большими файлами (например, больше, чем системная память) и, таким образом, сообщает о различиях между файлами, которые на самом деле одинаковы.
Я думал, что есть опция -h или bdiff, которая лучше работает с большими файлами, но я не могу найти ее в Fedora. Я считаю, что параметр --speed-large-files является преемником опции «-h» «нерешительное сравнение».
Другой подход состоит в том, чтобы повторить команду rsync, которую вы использовали, с '-vin' (verbose, itemize, 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 действительно предназначена для файлов строк текста, но она должна сообщать «идентичные» under -s для двоичных файлов.
--Brief должна подавлять любой вывод содержимого файла - мои извинения за то, что упустил его ранее - он был полу-похоронен в ужасном сценарии.