ファイルのコピー時にmd5またはsha1

ファイルのコピー時にmd5またはsha1

すべてのLinuxディストリビューションで、ファイルがローカルパーティションからNFSパーティションに転送されたときにmd5sumまたはsha1チェックを実行する方法はありますか?

例:

NFSマウントドライブがあり、ローカルドライブに非常に大きなファイルがあります。 md5スキャン中にファイルをNFSマウントドライブに転送したいと思います。ファイルをリモートドライブにコピーした後、md5を行うスクリプトをたくさん探してみましたが、100GBを超える非常に大きなファイルなので、ファイルがすでにコピーされているという点を活用する方法がないかと思います。転送時に赤にコピーされます。

ベストアンサー1

私はこれを行うことができる標準のLinuxユーティリティを知りません。ファイルがメモリベースのキャッシュに収まる場合は、まずmd5sumを実行してからコピー(コピーするとメモリからデータを取得)することはそれほど効率的ではありません。

次の組み合わせを使用できます。

cat filename | tee remote_output_name | md5sum

保存された md5 に直接md5sum印刷された合計を確認するように変更できます。これはディスクからファイルを一度だけ読み取ります。

check.md5あなたは

cd dir_with_big_files
md5sum * > check.md5

、次のPythonプログラムは一度に64Mbを読み書きし、単一のファイルをコピーして調べます。 /usr/local/bin/chkcopy として保存してchmod +x /usr/local/chkcopy使用します。chkcopy file_name check.md5 destination_filename_or_dir

#! /usr/bin/env python

import sys, os, hashlib

m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
    out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)

with open(file_name, 'rb') as ifp:
    with open(out_name, 'wb') as ofp:
        buf = ifp.read(BUF_SIZE)
        while buf:
            m.update(buf)
            ofp.write(buf)
            buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
    for line in fp:
        md5, fn = line.rstrip().split('  ', 1)
        if fn == file_name:
            assert m.hexdigest() == md5
            break
    else:
        print('no md5 found for ' + file_name)

おすすめ記事