ハードドライブから別のハードドライブにコピーした後の大きなディレクトリの検証

ハードドライブから別のハードドライブにコピーした後の大きなディレクトリの検証

私は Ubuntu を使用するホーム ファイル サーバーを持っています。

最近、ドライブの 1 つがいっぱいになったので、別のドライブを入手してそこに入れました。

非常に大きなフォルダーがあり、ディレクトリのサイズは約 1.7 T で、かなりの量のファイルが含まれています。

私はグーグル古いドライブから新しいドライブにファイルをコピーしましたが、問題なく動作したようです。

古いドライブからデータを削除してスペースを解放する前に、新しいドライブの新しいディレクトリを古いドライブの元のディレクトリと比較して検証したいと思います。これを行うには、CRC チェックを実行できると理解しています。

具体的にはどうすればいいのでしょうか?

答え1

次のコマンドを使用するだけですdiff:

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/

これはディレクトリ ツリー内のすべてのファイルを読み取り、比較し、相違点があれば報告します。このフラグは-rディレクトリを再帰的に比較しますが、ファイルが異なる場合は、実際の相違点を印刷するのではなく (テキスト ファイルの場合のように) 画面にメッセージのみを印刷します。このフラグは、異なるシンボリック リンクがある場合に役立ちます。たとえば、あるディレクトリにシンボリック リンクがあり、対応するディレクトリにリンク先のファイルのコピーがある場合などです。-q--no-dereference

diffコマンドが印刷する場合出力なしは、ディレクトリ ツリーが実際に同一であることを意味します。 を実行して、echo $?終了ステータスが であり0、両方のファイル セットが同じであることを示すことを確認できます。

この場合、CRC やチェックサムを計算することは特に有益ではないと思います。2 つのファイル セットが異なるシステム上にあり、各システムが独自のファイル セットのチェックサムを計算できれば、ネットワーク経由でチェックサムのみを送信すればよくなります。チェックサムを計算するもう 1 つの一般的な理由は、将来の使用に備えてチェックサムのコピーを保持することです。

答え2

rsyncは、ファイルのコピーに の代わりによく使用されますgcpが、コピーがどのようにして作成されたかを確認するためにも使用できます。

rsync -niaHc /origfolder/ /copyfolder

最初のフォルダ名(ソース)の末尾に を付けてください/。オプションは次のとおりです。

  • -nコピーしない(変更しない)
  • -i違いを列挙する
  • -a権限、所有権、シンボリックリンクなどを保持(つまり、持っているので比較-n)し、ディレクトリを再帰的に調べる
  • -Hハードリンクを保存する
  • -cチェックサムを比較する

出力には、異なるファイルまたはディレクトリごとに、その違いを詳細に示すコードが表示されます。同じ場合は出力されません。コードには列があり、比較のその側面が正常であればYXcstpoguax各文字はドット.、そうでない場合は文字になります。

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ

例えば、

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied

詳細については、man rsync以下を参照してください。3 列目または 4 列目に相違がある場合は、深刻なデータ破損があります。権限、所有者、タイムスタンプが異なるなどの他のフラグは、それほど重要ではない可能性があります。すべてのファイルが「不足」としてマークされている場合は、比較するディレクトリが正しく指定されていない可能性があります。確信がある場合は、フラグなしで rsync を実行すると、相違が「修正」されます。--itemize-changescs-n

答え3

私も同じ疑問を持っていたのでアンソニーの答え少しひねりを加えて。

彼の回答を直接適用すると、何らかのハードウェア障害 (入出力エラーなど) が発生して diff が強制終了した場合に失敗します。

私は彼の答えをまとめ、この答えそれをまとめて次のようにします。

find /path/to/original -type f -exec bash -c 'diff -rq --no-dereference "$@" "/path/to/destination/$(sed -r "s/^.*(<first-common-ancestor>.*)$/\1/g" <<<"$@")"' bash {} \;
  • /path/to/originalコピーした元のディレクトリのパスに置き換えます。
  • /path/to/destinationコピー先のディレクトリのパスに置き換えます。
  • <first-common-ancestor>を両者の共通の祖先ディレクトリに置き換えます。例:/media/foo/barからにコピーしている/media/test/dst/ため、dstコピー操作が完了すると、 にはディレクトリ が含まれますbar。最初の共通の祖先はbarここにあります。これは、その下のすべてのファイルbarの相対パスが同じになるためです。

いくつかの注意点:

  • および部分bash -cbash {}、ファイル名の安全な置換を実行し、安全のために、起こりうる攻撃 (権限の昇格など) による被害を受けないようにするためのものです。
  • このsed部分は、見つかったファイルの絶対パスを削除し、相対パスのみを使用することです(これは を使用することとは異なりますexecdir)。これがどのように役立つかわからない場合は、これを削除してエラーメッセージを確認してください :)
  • <<<変数を、読み取りファイルへのパスとして読み取るのではなく、文字列として読み取ります。

関連情報