web-dev-qa-db-ja.com

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

Ubuntuを使用しているホームファイルサーバーがあります。

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

私は非常に大きなフォルダを持っています。ディレクトリのサイズは約1.7 Tで、適切な量のファイルが含まれています。

古いドライブから新しいドライブにファイルをコピーするために [〜#〜] gcp [〜#〜] を使用しましたが、正常に機能しているようです。

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

具体的には、どうすればよいですか?

8
Peter A

私は単にdiffコマンドを使用します:

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

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

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

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

13

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--itemize-changesをご覧ください。 3番目のcまたは4番目のs列に違いがある場合は、深刻なデータ破損があります。異なる権限、所有者、タイムスタンプなどの他のフラグは、あなたにとってそれほど重要ではないかもしれません。すべてのファイルが「欠落」としてマークされている場合は、比較する適切なディレクトリを指定していない可能性があります。確かな場合は、-nフラグなしでrsyncを実行すると、違いが「修正」されます。

5
meuh

同じ質問があり、少しひねりを加えて Anthonyの回答 を使用しました。

Diffを強制的に終了させるハードウェア障害(入出力エラーなど)がある場合、彼の回答を直接適用すると失敗します。

私は this answer とともに彼の回答をまとめ、これをまとめてこれに入れました:

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