RAID間で2,000,000ファイル(3TB)をrsyncしただけです。
データが損なわれていないことを確認したい。
rsync -c
には非常に長い時間がかかります。
diff
は何をしているのか私に表示しません。
(a)より高速で、(b)比較しながら進行状況を示す代替案はありますか?
(私はMacを使っており、brew search diff
がくれますapgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff
...これらの1つで十分でしょうか?)
修正とオプションの明確化のために編集-「--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で定義されているため、かなり移植性があります。あなたは次のようなものを追加したいかもしれません:
|ティー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は、ファイルコンテンツの出力を抑制します-以前に見落としたことをお詫びします-これは醜いスクリプトに半埋め込みされていました。
これはdiff
で、ファイル数に基づく進捗レポートが表示されます。
diff -rqs dir1 dir2 | pv -l -s filecount > logfile
Pv(パイプビューア)が必要です: http://www.ivarch.com/programs/pv.shtml
説明:
diff -r
ディレクトリとサブディレクトリを再帰的に比較します。diff -q
異なるファイルのファイル名のみを出力します。実際の違いを印刷しません。diff -s
差異のないファイルのファイル名も出力します。これは進捗情報にとって重要です。pv -l
行数に基づいて進捗状況を報告します。pv -s count
カウントに基づいて完了までの時間を見積もります。logfile
へのリダイレクトは、きれいな出力用です。そうしないと、diff
からの出力がpv
からのステータス行と混ざります。ファイル数を取得するには、次のコマンドを使用します。
find dir1 -type f | wc -l
異なるファイルのログファイルをフィルタリングします。
grep -v "^Files .* identical$" logfile
このバリエーションでは、logfile
にすべてを記録しながら、リアルタイムで異なるファイルを印刷します。
diff -rqs dir1 dir2 | pv -l -s filecount |
tee logfile | grep -v "^Files .* identical$"
または、異なるファイルのみをログに記録することもできます。
diff -rqs dir1 dir2 | pv -l -s filecount |
grep -v "^Files .* identical$" > logfile
注:上記のコマンドは、ファイル数に基づいて進行状況を報告します。これは、小さなファイルが多数ある場合に最適です。あなたがいくつかの巨大なファイルを持っているなら、あなたはこれでそれほど楽しくないでしょう。
悲しいことに、比較したバイト数に基づいて進行状況を報告する簡単な方法がわかりません。
メタデータ(ファイルの実際のコンテンツではない)を比較するだけで平穏を見つけることができる場合は、rsyncを使用できます。これはかなり速くなります。
詳細については:
データの整合性をチェックするために、ある種のハッシュアプリケーションを使用することを検討します。多くの重複ファイル検索ユーティリティがハッシュを使用して重複/非重複を識別することを知っています。これは価値のある調査かもしれないと私には思えます。
そのために rdiff-backup を使用できます。両方のサーバーにインストールすると、チェックサムのスマートな比較が行われ、まだ存在しないものが同期されます。