我正在尝试制作一个脚本,用于将我的家和其他重要目录备份到外部驱动器,同时排除某些目录和文件类型(--exclude
)。如果我将文件类型或目录添加到排除列表(--delete-excluded
),则需要在备份中删除排除的文件。
此外,还需要备份所有已删除的内容,以防出现严重错误(--backup --backup-dir=rsync/backup
)。
我刚开始:
#!/usr/bin/env bash
PATH_PWD="`pwd`"
PATH_HOME=~
SRC="/home/redsandro"
PATH_TARGET="/media/redsandro/MyBook 4TB/backup/`hostname`"
PATH_BIN="${SRC}/bin"
EXCL_FROM="${PATH_BIN}/rs-backup-external.sh.exclude.txt"
DATE="`date +%Y-%m-%d`"
OPTS="-ahl --update --del --delete-excluded --force --ignore-errors --progress --stats --exclude-from=$EXCL_FROM --log-file=~/rsync/rsync.$DATE.log"
OPTS="$OPTS --backup --backup-dir=rsync/backup/${DATE}"
#OPTS="$OPTS --dry-run"
echo Backing up $SRC to $PATH_TARGET...
echo
sudo rsync $OPTS "$SRC/" "${PATH_TARGET}${SRC}"
现在,显然--del
与--backup --backup-dir=rsync/backup
冲突了。我可以排除此目录被删除吗?或者是否有更简单的方法可以做到这一点?
我的目标是拥有一个可以在我的所有机器上运行的脚本,其中一部分与计算机专用目录同步,另一部分(文档,图片)同步到全局目录,因为它们都需要是无论如何。
答案 0 :(得分:2)
Rsync是一个很棒的工具,但有时难以使用。
问题是你正在使用--exclude-from
,它将全局排除规则设置为发送方和接收方。
在rsync对文件系统执行操作之前,它将首先组合两个文件列表,一个用于发送方(客户端),另一个用于接收方(服务器)。如果从双方排除文件,rsync将忽略它。如果它仅从发送方排除并存在于接收方,则rsync将删除它。
在您的情况下,由于您的规则是从双方排除文件,rsync不会删除它们。然后使用--delete-excluded
强制删除。但是,正如您所说,此选项与--backup --backup-dir=rsync/backup
冲突。
我建议你这样做。
$EXCL_FROM
转换为普通过滤器文件,即在每行前插入减号以使其排除规则。--exclude-from=$EXCL_FROM
和--delete-excluded
。-FF
。在调用rsync之前包含以下命令。
cp "$EXCL_FROM" "$SRC/.rsync-filter"
这样,您的规则将仅适用于发送方,如果找到,将从接收方删除指定为排除规则的文件。这不应与备份选项冲突。
<强>更新强>
实质上,-FF
选项是在传输的两端创建名为.rysnc-filter
的rsync进程每目录过滤器文件。在您的情况下,它只存在于发送方,因此其规则不适用于接收方。
实际上,-FF
等于-F -F
。第一个F
告诉rsync在源和目标目录的根目录中合并来自.rsync-filter
的规则,就像我之前说的那样。第二个F
告诉rsync排除它们。您不希望转移.rsync-filter
,否则您的排除规则也会适用于接收方,原始问题将会返回 - 排除的文件将不再被删除。
以下是man (1) rsync
所说的内容:
-F same as --filter='dir-merge /.rsync-filter'
repeated: --filter='- .rsync-filter'
答案 1 :(得分:0)
一种选择是使用绝对路径(用--backup-dir
指定)将../
放在备份文件夹之外。
即。 --backup-dir="../rsync/backup/${DATE}"
这将在与目标文件夹相同的级别上创建一个新文件夹。例如,如果您要导出到/home/user/rsync/backup
,则上述命令会将已删除的文件存储在home/user/rsync/rsync/backup/${DATE}