Проблема дифференциального резервного копирования с использованием сравнения с md5sum в сценарии оболочки

Здравствуйте, у меня быстрый вопрос. Я пытаюсь реализовать дифференциальное резервное копирование, но у меня возникают проблемы со сравнением хэша из md5sum.txt с diffmd5.txt.

Я получаю следующую ошибку:

В настоящее время команда выполняется и не выдает ошибок, но файлы не заменяются и не создаются резервные копии файлов.

#!/bin/bash
bkdest="/home/user/backup/differential/backup_diff"
bksource="/home/user/Documents"

destgen=`find $bkdest/* -exec md5sum {} + > diffmd5.txt`
sourcegen=`find $bksource/* -exec md5sum {} + > md5sum.txt`

    $sourcegen
    $destgen

$(cat diffmd5.txt) | while read f;
do
        if [ $(grep f md5sum.txt | wc -l) -lt 1 ]
            then
                # Code to backup the file that has changed or is not on record
                cp $(cut -d ' ' -f2-- <<< $f) $bkdest   
        fi
done
                # Afterwards, update md5hashes to list newly backed up files
                $sourcegen

Пожалуйста, помогите мне понять, где я ошибся. Благодарю вас!

Думаю, это моя ошибка при работе в режиме отладки

Try 'cp --help' for more information.
grep: md5sum.txt: No such file or directory
cut: invalid byte, character or field list
Try 'cut --help' for more information.
cp: missing destination file operand after ‘/home/dmitriy/backup/differential/backup_diff’

person Dmitriy    schedule 05.08.2015    source источник
comment
Второй вызов $sourcegen должен быть вне основного цикла?   -  person pasaba por aqui    schedule 05.08.2015
comment
md5hashes.txt не является результатом какой-либо команды find. Кроме того, убедитесь, что вы не используете diffmd5 вместо md5sum и наоборот.   -  person pasaba por aqui    schedule 05.08.2015
comment
@pasaba por aqua я исправил и использовал вместо этого, как указано в первом комментарии. diffmd5.txt — это исходная база данных исходной резервной копии, с которой мы сравниваем, а md5sum.txt — это база данных из файлов, которые мы собираемся сделать резервной копией. Я только что увидел свою проблему, что в grep у меня есть md5hashes.txt.   -  person Dmitriy    schedule 05.08.2015
comment
@Dimitry: напомню, что f из diffmd5.txt, то есть из каталога bkdest. Вы не можете использовать его как первый аргумент cp, но второй.   -  person pasaba por aqui    schedule 05.08.2015
comment
md5 files содержит значение md5 и имя файла. По этой причине у вас возникает ошибка cp: cannot stat ‘9000a3c48f47c26b6c2dcb23d8281cf9’: Нет такого файла или каталога. В статусе копирования используйте: cp $(cut -d ' ' -f2-- ‹‹‹ $f) $bkdest   -  person pasaba por aqui    schedule 05.08.2015
comment
@pasaba por aqua Я отредактировал код с обновлением, я попробую запустить его снова, чтобы посмотреть, как оно работает, и обновить его здесь. Благодарю вас!   -  person Dmitriy    schedule 05.08.2015
comment
В настоящее время я получаю эту ошибку, когда пробовал код с последним редактированием ./bkdiff: строка 11: 1d3935adac5b184a388826a4c718601c: команда не найдена   -  person Dmitriy    schedule 05.08.2015
comment
@Dmitriy: Это потому, что $(cat diffmd5.txt) расширяется до содержимого diffmd5.txt. Это содержимое не является подходящей командой.   -  person ruakh    schedule 05.08.2015
comment
@ruakh в настоящее время я не получаю никаких ошибок, но мои измененные файлы, похоже, не копируются и не перезаписываются поверх оригинала. Спасибо!   -  person Dmitriy    schedule 05.08.2015
comment
Замените: a) $(cat diffmd5.txt) на cat diffmd5.txt b) find $bkdest/* ... включает полный путь в файле, нам это не нужно, используйте cd $bkdst; найти . ... вместо; c) удалить второй вызов $sourcegen   -  person pasaba por aqui    schedule 05.08.2015
comment
Похоже что-то с КП. Получение следующего cp: отсутствует операнд целевого файла после «/home/user/backup/дифференциал/backup_diff». Попробуйте «cp --help» для получения дополнительной информации. странно, что мой пункт назначения правильный. Мой cp выглядит так: cp $(cut -d ' ' -f2-- ‹‹‹ $f) $bkdest   -  person Dmitriy    schedule 05.08.2015


Ответы (1)


Давайте попробуем с:

#!/bin/bash

bkdest="/home/user/backup/differential/backup_diff"
bksource="/home/user/Documents"

cd $bkdest
find . -type f -exec md5sum {} \; > /tmp/md5dest.txt

cd $bksource
find . -type f -exec md5sum {} \; | while read c f; do
    if fgrep "$c" /tmp/md5dest.txt | fgrep -q "$f"; then
       echo "$f" ignored
    else
       cp $f $bkdest
    fi
done
person pasaba por aqui    schedule 05.08.2015
comment
Я получаю несколько ошибок с этим скриптом. Не уверен, от чего зависит проблема: cp: не удается определить «test2»: нет такого файла или каталога. Cut: d41d8cd98f00b204e9800998ecf8427e: нет такого файла или каталога. - person Dmitriy; 05.08.2015
comment
вау, у тебя отлично работает! Есть ли способ выяснить, в чем проблема с моим? Не хочу плагиата для проекта. Потом переделаю и сделаю лучше. Пытаюсь понять, в чем заключается моя проблема. В настоящее время он работает без ошибок, но ничего не перезаписывается. Может быть что-то с функцией копирования. Спасибо за помощь! - person Dmitriy; 05.08.2015
comment
@Dimitry: выполнить с помощью bash -x для отладки и просмотреть содержимое временных файлов, чтобы убедиться, что это ожидаемый файл. - person pasaba por aqui; 05.08.2015