首页 > 解决方案 > 如何在 Ubuntu 中编写增量备份脚本?

问题描述

我想在 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

标签: bashubuntubackup

解决方案


这是reinventing the wheel一种东西。

有一些为此目的编写的实用程序,仅举几例

rsync

GNUcp(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

  • 在 shebang 之后添加set -x以查看实际执行的内容,祝你好运。

推荐阅读