修正とオプションの明確化のために編集-「--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で定義されているため、非常に移植性があります。次のようなものを追加できます。
| tee diff-out.1 | grep -v -Ee 'ファイル。*と。*は同一です'
chksumやハッシュを使用することもできますが、それらをファイルツリーと同期させる必要があるため、とにかくすべてのファイルのすべてのバイトを読み取ることになります。
編集-コメントにするには長すぎます:
10GBを超えるファイルは検証されません
次の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ユーティリティは実際にはテキスト行のファイルを対象としていますが、バイナリファイルの-sの下で「同一」を報告する必要があります。
--briefは、ファイルコンテンツの出力を抑制します(以前に見落としていたことをおmyびします)--いスクリプトで半ば埋められました。