大規模なディレクトリと進捗レポートを比較する


13

あるRAIDから別のRAIDに2,000,000個のファイル(3TB)を再同期しました。

データが損なわれていないことを確認したい。

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 ますが、これらのいずれかが仕事をするでしょうか?)



また、なぜrsyncデータを約150MB / sでコピーdiffしたのに、60MB / sでしか比較できないのか混乱しています...?
ダン14年

1
使用するコピーrsyncrsyncデフォルトで高速ですb / c はデフォルトでチェックサムを使用してファイルを比較せず、サイズと日付情報を確認します。rsync -cすべてのファイルを使用する場合、チェックサムを計算する必要がありますが、これは面倒な作業であり、それがデフォルトではない理由です。
slm

はい、しかしdiffはコピーしません...両方のファイルを読み込むだけです。一方、rsyncはコピーするには、各バイトを読み取ってから書き込む必要があります。これはゼロからのrsyncであったため、すべてのファイルをコピーしていました。
ダン14年

回答:


6

修正とオプションの明確化のために編集-「--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びします)--いスクリプトで半ば埋められました。


mvドライブのルートにある「検証済み」フォルダーに見つかったすべてのファイルに、フルパスを保持して取得する方法はありますか?たとえば、/disk1/a/b/c/file1がと同一の場合/disk2/a/b/c/file1、に移動し/disk1/verified/a/b/c/file1ます。それから私はひどくコピーされたファイルだけで終わることができました。(これまでのところ、10GBを超えるファイルの多くは検証されていません。これは恐ろしいことです。)
ダン14年

このオプションを試してみてください:
Dマッケオン14年

それは正確に何をしますか?
ダン14年

実行した場合rsync -vin、バイト単位またはチェックサムの比較が行われますか?を追加しない限り、rsyncはサイズ/日付のみを比較すると考えました-c。そして、私が読んspeed large filesだことから、非バイナリファイルだけで違いが出るようです...または間違っていますか?
ダン14年

diff"Files __ and ___ differ"... の形式で結果を表示し、それを実行してsed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"、不良ファイルを再コピーするためのスクリプトを生成しようとします。ただし、diffの出力は引用符で囲まれていないため、機能しません。引用されたパスを教えてもらうことはできますか?
ダン14年

4

以下は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を使用できます。これはかなり速くなります。

詳細については:


0

何らかのハッシュアプ​​リケーションを使用してデータの整合性をチェックすることを検討します。多くの重複ファイル検索ユーティリティは、ハッシュを使用して重複/非重複を識別します。これは価値があるかもしれない調査であるように思えます。


0

そのためにrdiff-backupを使用できます。両方のサーバーにインストールすると、チェックサムのスマートな比較が行われ、まだ存在しないものが同期されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.