复制文件时使用 md5 或 sha1

Okt*_*tav 2 linux nfs hashsum checksum

当文件从本地分区传输到 NFS 分区时,任何 linux 发行版中是否有办法执行 md5sum 或 sha1 检查?

例子:

我的本地驱动器上有一个 NFS 安装驱动器和一个非常大的文件。我想将该文件传输到 NFS 安装的驱动器,同时进行 md5 检查。我发现很多脚本可以在将文件复制到远程驱动器上后执行 md5,但由于它是一个 100GB+ 的非常大的文件,我想知道是否有办法利用该文件已经存在的事实传输时红色。

Ant*_*hon 5

我不知道可以执行此操作的标准 Linux 实用程序。如果文件适合您的基于内存的缓存,那么首先执行 md5sum 然后复制(副本将从内存中获取数据)不会那么低效。

您可以使用以下组合:

cat filename | tee remote_output_name | md5sum
Run Code Online (Sandbox Code Playgroud)

您可以修改它以直接md5sum根据存储的 md5检查打印的总和。这仅从光盘读取文件一次。

假设你已经产生了check.md5

cd dir_with_big_files
md5sum * > check.md5
Run Code Online (Sandbox Code Playgroud)

,以下 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)
Run Code Online (Sandbox Code Playgroud)