web-dev-qa-db-ja.com

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

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つで十分でしょうか?)

13
Dan

修正とオプションの明確化のために編集-「--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は、ファイルコンテンツの出力を抑制します-以前に見落としたことをお詫びします-これは醜いスクリプトに半埋め込みされていました。

6
D McKeon

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

詳細については:

4
lesmana

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

0
O T Coder

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

0
Timo