非常に大きなファイル(200GB)があります。どうやらコピーをしてみるとちゃんとコピーになりませんでしたね。両方のsha1ハッシュ値が異なります。ファイルをチャンク(1MBや64MBなど)に分割し、各チャンクのハッシュ値を出力する方法はありますか?それでは比較/修正?
これを行うには、クイックアプリを作成することもできます。
答え1
この「クイックアプリ」はすでに存在し、比較的一般的です:rsync。もちろん、rsyncはそれ以上を行いますが、望むものは非常に簡単です。
rsync -cvP --inplace user@source:src-path-to-file dest-path-to-file # from the destination
rsync -cvP --inplace src-path-to-file user@dest:dest-path-to-file # from the source
デフォルトでは、ssh(または非常に古いバージョンではrsh)が接続を確立してデータを転送するために使用されます。他の方法も可能です。
私が渡したオプションは次のとおりです。
-c
- ファイルサイズ/ランタイムではなくチェックサムに基づいてスキップします。デフォルトでは、rsyncはサイズとランタイムに一致する転送を最適化してスキップします。-c
強制的にチェックサムを計算します(I / Oの面で高価な作業)。これはブロックベースのチェックサムであり(ファイル全体を実行するように指示しない限り)、破損したブロックのみを送信します。ブロックサイズは自動的に選択されますが、オーバーライドすることができます-B
(そうする理由があるかどうか疑問です)。-v
- Verboseはいくつかの詳細(処理中のファイル)を提供します。-P
- 2つの部分ファイル(中間ジョブが完了してもジョブを放棄しないように)と進行状況バーを開きます。--inplace
- 一時ファイルではなく既存のファイルを更新します。これにより、元のファイルが置き換えられます。 200GBの一時ファイルを取得する必要はありません。また、部分ファイルを意味するので、-P
部分的に重複します。
注:生の転送をどのように実行しているのかわかりませんが、sftp / scpなら何かが間違っています。ネットワークの損傷を完全に防ぎます。本当にその理由を見つけなければなりません。 RAM障害は比較的一般的です。
答え2
ネットワーク接続を介してファイルを別のデバイスに再送信するには、rsyncの使用。
違いが何であるかを確認したい場合は、最も簡単な方法は同じコンピュータに両方のバージョンをインストールすることです。帯域幅が高すぎてそれを望まない場合は、ファイルブロックを確認する方法は次のとおりです。
この方法は、head -c
中断された場所にファイルの場所を残し、サイズを事前に計算してループを終了する場所を特定することに依存します。
n=$(($(wc -c <very_large_file) / (64*1024*1024) + 1))
i=0
while [ $i -gt $n ]; do
head -c 64m | sha256sum
i=$((i+1))
done <very_large_file
この方法はhead -c
中断されたファイルの場所をそのまま維持し、cksum
各ブロックのサイズを見つけるために使用されます(短いブロックはファイルの終わりを示します)。
while true; do
output=$(head -c 64m | cksum)
size=${output#* }; size=${output%% *}
if [ $size -eq 0 ]; then break; fi
echo "$output"
done <very_large_file
このメソッド呼び出しは、dd
各ブロックの目的の開始位置にジャンプします。
n=$(($(wc -c <very_large_file) / (64*1024*1024) + 1))
i=0
while [ $i -gt $n ]; do
dd if=very_large_file ibs=64m skip=$i count=1 | sha256sum
i=$((i+1))
done <very_large_file