Как написать скрипт для инкрементного резервного копирования в Ubuntu? - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу реализовать инкрементное резервное копирование в Ubuntu, поэтому я подумываю найти md5sum для всех файлов из источника и цели и проверить, имеют ли два файла одинаковую md5sum, а затем сохранить этот файл в месте назначения, в противном случае скопируйте файл из источника в каталог. Я думаю сделать это в bash Может кто-нибудь помочь мне с командами, как проверить md5sum двух файлов в разных каталогах? Заранее спасибо !!

 #!/bin/bash
 #
 SOURCE="/home/pallavi/backup1" 
 DEST="/home/pallavi/BK"
 count=1

 TODAY=$(date +%F_%H%M%S)
  cd "${DEST}" || exit 1
  mkdir "${TODAY}"

  while [ $count -le 1 ]; do 
  count=$(( $count + 1 ))
  cp -R $SOURCE/* $DEST/$TODAY
  mkdir "MD5"
  cd ${DEST}/${TODAY}
  for f in *;do
    md5sum "${f}" >"${TODAY}${f}.md5"
  echo ${f}
  done
  if [ $? -ne 0 ] && [[ $IGNORE_ERR -eq 0 ]]; then
  #error or eof
   echo "end of source or error"
   break
  fi
  done

1 Ответ

0 голосов
/ 18 апреля 2020

Это что-то вроде reinventing the wheel.

Для этой цели написана какая-то утилита для именования нескольких .

rsync

GNU cp(1) имеет флаг -u.

cp 

Для сравнения файлов

cmp
diff

Для поиска дубликатов

fdupes
rmlint

Здесь это то, что я придумал re-inventing the wheel.

#!/usr/bin/env bash

shopt -s extglob

declare -A source_array

while IFS= read -r -d '' files; do
  read -r source_hash source_files < <(sha512sum "$files")
  source_array["$source_hash"]="$source_files"
done  < <(find source/ -type f -print0)

source=$( IFS='|'; printf '%s' "@(${!source_array[*]})" )

while IFS= read -r -d '' files0 ; do
  read -r destination_hash destination_files < <(sha512sum "$files0")
  if [[ $destination_hash == $source ]]; then
    echo "$destination_files"  FOUND from source/ directory
  else
    echo "$destination_files"  NOT-FOUND from source/ directory
  fi
done < <(find destination/ -type f -print0)
  • Должно быть достаточно безопасно от файлов с пробелами и табуляциями и новыми строками, но так как я не есть файлы с новыми строками, поэтому я не могу сказать.

  • Измените действие из оператора if-else в зависимости от того, что вы хотите сделать.

  • Хорошо, может быть sha512sum немного убито, измените его на md5sum

  • Добавьте set -x после шебанга, чтобы увидеть, что на самом деле происходит выполнено, удачи.
...