md5 или sha1 при копировании файла

php /path/to/script.php > logfile || cat logfile; rm logfile

который выводит стандартный вывод в logfile и только производит его, если сценарий перестал работать (выходит ненулевой).

Примечание: если Ваш сценарий мог бы также произвести к stderr затем необходимо перенаправить stderr кому: stdout. Иначе что-либо распечатанное к stderr заставит крон посылать электронное письмо, даже если код выхода будет 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
2
18.10.2013, 11:04
3 ответа

Я не знаю о стандартной утилите Linux, которая может сделать это. Если бы файл поместился бы в Ваш основанный на памяти кэш, это не было бы настолько неэффективно, чтобы сначала сделать md5sum и затем скопировать (копия получит данные из памяти).

Можно использовать следующую комбинацию:

cat filename | tee remote_output_name | md5sum

который Вы смогли исправлять для прямой проверки суммы, распечатанной md5sum против сохраненного md5. Это читает файл из диска только однажды.

Принятие Вас генерировало a check.md5 с

cd dir_with_big_files
md5sum * > check.md5

, следующая программа Python сделала бы копирование и проверку единственный файл, читающий/пишущий в 64 МБ за один раз. Сохраните его как/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)
5
27.01.2020, 21:54
  • 1
    Какая-либо идея о том, будет ли использование мишени вместо cp/dd/rsync заметно влиять на скорость больших копий? Я погуглил свой путь здесь, потому что я думал о том же приеме, чтобы сэкономить время на проверке и не могу думать ни о какой другой причине использовать его. большое спасибо –  ndemou 30.06.2016, 11:47

Вы можете использовать внешнюю программу ( CRCSUM ), который расширяется CP и MV с контрольной суммой:

https://sourceforge.net/ Проекты / CRCSUM /

1
27.01.2020, 21:54

Существует форк хорошо -известного ddс расширенной функциональностью под названием dcfldd, который я использовал в течение многих лет, или исправленнаяdd-версия под названиемdc3ddс несколько схожими функциями.

Оба инструмента могут выполнять хеширование (даже с несколькими типами хеширования -одновременно, если это требуется )во время копирования. Хеши могут быть рассчитаны для фрагментов и/или всего потока данных -.

некоторые дистрибутивы, такие как debian, прямо предлагают пакеты в своих репозиториях, пакеты для Fedora доступны, например, во внешних репозиториях cert -.

Копирование файла фрагментами по 8 МиБ -и вычисление суммы MD5 всех данных, которая выводится в STDERR:

dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile

Чтобы скопировать файл фрагментами по 8 МиБ -, вычислите хэш SHA256 -всех данных плюс сумму SHA256 для каждого блока по 64 МиБ -:

.
dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile

Выходной файл -для вычисленного хэша также можно указать, указав файл с помощью параметра hashlog. При вычислении нескольких хэшей отдельные выходные данные могут быть указаны, например, через. md5log=FILE1.log sha256log=FILE2.log.

2
27.01.2020, 21:54

Теги

Похожие вопросы