Não tenho conhecimento de um utilitário padrão do Linux que possa fazer isso. Se o arquivo couber em seu cache baseado em memória, não seria tão ineficiente fazer primeiro o md5sum e depois copiar (a cópia obteria os dados da memória).
Você pode usar a seguinte combinação:
cat filename | tee remote_output_name | md5sum
que você pode alterar para verificar diretamente a soma impressa por md5sum
no md5 armazenado. Isso lê o arquivo do disco apenas uma vez.
Supondo que você gerou um check.md5
com
cd dir_with_big_files
md5sum * > check.md5
, o seguinte programa do Python faria a cópia e a verificação de um único arquivo, lendo / gravando em 64 MB de cada vez. Salve como / usr / local / bin / chkcopy, chmod +x /usr/local/chkcopy
e
chame-o com 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)