editar para correção e clareza das opções - esqueci '--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
e adicione outras opções a gosto, dependendo do que você está comparando:
-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
O diff -rs lerá todos os bytes do original e copiará e reportará os arquivos iguais.
O formato de saída diff é definido pelo POSIX, por isso é bastante portátil. Você pode adicionar algo como:
| tee diff-out.1 | grep -v -E '' Arquivos. * e. * são idênticos '
Você pode usar chksums ou hashes, mas é necessário mantê-los sincronizados com as árvores de arquivos, para voltar a ler todos os bytes de cada arquivo.
EDIT - muito tempo para ser um comentário, em resposta a:
arquivos com mais de 10 GB não estão verificando
Você pode tentar esta opção diff: --speed-large-files
É possível que o diff que você está usando não esteja lidando bem com arquivos muito grandes (maiores que a memória do sistema, por exemplo) e, portanto, esteja relatando diferenças entre os arquivos que são realmente iguais.
Eu pensei que havia uma opção -h ou um 'bdiff' que se saía melhor em arquivos grandes, mas não consigo encontrar um no Fedora. Acredito que as opções --speed-large-files são sucessoras de uma opção '-h' "comparação sem entusiasmo".
Uma abordagem diferente seria repetir o comando rsync que você usou, com '-vin' (verbose, itemize, no_run). Isso reportaria quaisquer diferenças encontradas pelo rsync - e não deveria haver nenhuma.
Para mover alguns arquivos, você está vendo um script como:
if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv "$dir2/$path" "$target"
fi
mas eu não recomendo fazer isso. A questão subjacente é "como posso ter certeza de que o rsync copiou corretamente uma hierarquia de arquivos?" e se você puder demonstrar para si mesmo que o rsync está funcionando bem, com diff ou alguma outra ferramenta, basta confiar no rsync, em vez de contorná-lo.
O rsync -vin será comparado com qualquer outra opção que você escolher. Eu pensei que era padrão a soma de verificação, mas você está certo, -c ou --checksum é necessário para isso.
O utilitário diff é realmente destinado a arquivos de linhas de texto, mas deve reportar sub-idênticos 'idênticos' para arquivos binários.
O --brief deve suprimir qualquer saída de conteúdo do arquivo - minhas desculpas por ignorá-lo mais cedo - foi semi-enterrado em um script feio.