bash - 如何在 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
解决方案
这是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
以查看实际执行的内容,祝你好运。
推荐阅读
- azure-ad-b2c - Azure B2C - 显示控制 - 使用 Mailjet 发送电子邮件验证
- mongodb - MongoDB,如何使用条件更新多个值
- ios - 为什么不可靠地调用 UIApplicationDelegate 方法`application(_:configurationForConnecting:options:)`
- php - 多态关系未在数据库中插入模型类型
- python - 用 Python 中第二个数组中随机选择的 50% 值随机替换一个数组的 50% 值
- c++ - 这里出现“sigbrt”错误的原因是什么?
- flutter - 如何将 Row 内的容器拉伸到最大可用高度?
- mysql - SQl 不接受节点 js 中的插入查询抛出 ER_BAD_FIELD_ERROR
- angular - 启用 Azure Active Directory 身份验证时 Azure App Service HTTP ERROR 400
- elasticsearch - Elasticsearch:获得输出的赞美