5

我正在尝试制作一个脚本,用于将我的主目录和其他重要目录备份到外部驱动器,同时排除某些目录和文件类型(--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. 我可以排除这个目录被删除吗?或者是否有更简单的方法来做到这一点?

我的目标是拥有一个可以在我的所有机器上运行的脚本,其中一部分同步到特定于计算机的目录,另一部分(文档、图片)同步到全局目录,因为无论如何它们都需要相同。

4

2 回答 2

2

Rsync 是一个很棒的工具,但有时很难使用。

问题是您正在使用--exclude-from,它将全局排除规则设置为发送方和接收方。

在 rsync 对文件系统执行操作之前,它首先会组装两个文件列表,一个用于发送端(客户端),另一个用于接收端(服务器)。如果文件被双方排除,rsync 将简单地忽略它。如果它只从发送端排除并且存在于接收端,rsync 会删除它。

在您的情况下,由于您的规则排除了双方的文件,因此 rsync 不会删除它们。然后您使用--delete-excluded来强制删除。但是,就像你说的,这个选项与--backup --backup-dir=rsync/backup.

我建议您执行以下操作。

  1. 转换$EXCL_FROM为普通过滤文件,即在每行前插入减号,使其排除规则。
  2. 从 rsync 选项中删除--exclude-from=$EXCL_FROM和。--delete-excluded
  3. 包括-FF在 rsync 选项中。
  4. 在调用 rsync 之前包含以下命令。

    cp "$EXCL_FROM" "$SRC/.rsync-filter"
    

这样,您的规则将仅适用于发送方,如果找到指定为排除规则的文件将从接收方删除。这不应与备份选项冲突。

更新

本质上,该-FF选项是使 rsync 进程.rysnc-filter在传输双方命名的每个目录过滤文件。在您的情况下,它将仅存在于发送方,因此其规则不适用于接收方。

实际上,-FF等于-F -F。第一个告诉 rsync 从源目录和目标目录的根目录F合并规则,就像我之前说的那样。.rsync-filter第二个F告诉 rsync 排除它们。您不希望.rsync-filter被转移,否则您的排除规则也将适用于接收方,并且您的原始问题将返回 - 排除的文件将不再被删除。

这是我的man (1) rsync说法:

-F    same as --filter='dir-merge /.rsync-filter'
      repeated: --filter='- .rsync-filter'
于 2013-10-12T20:12:06.240 回答
0

一种替代方法是--backup-dir使用绝对路径(用 指定)定位您在备份文件夹之外的位置../

IE。--backup-dir="../rsync/backup/${DATE}"

这将在与您的目标文件夹相同的级别创建一个新文件夹。例如,如果您要导出到/home/user/rsync/backup上述命令,则将删除的文件存储在home/user/rsync/rsync/backup/${DATE}

于 2019-04-11T21:49:49.707 回答