我如何防止在rsync中删除一个目录

我试图做一个脚本来备份我的家和其他重要的目录到外部驱动器,同时排除某些目录和文件types( --exclude )。 排除的文件也需要在备份上删除,以防将文件types或目录添加到排除列表( --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冲突。 我可以排除这个目录被删除吗? 或者有没有更简单的方法来做到这一点?

我的目标是在所有机器上运行脚本,其中一部分同步到计算机特定的目录,另一部分(文档,图片)同步到全局目录,因为它们都必须是相同的。

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

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

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

在你的情况下,由于你的规则是从双方排除文件,rsync不会删除它们。 然后使用--delete-excluded来强制删除。 但是,正如你所说,这个选项与--backup --backup-dir=rsync/backup冲突。

我建议你做下面的事情。

  1. $EXCL_FROM转换$EXCL_FROM正常的过滤文件,即在每行之前插入减号以使其排除规则。
  2. 删除--exclude-from=$EXCL_FROM--delete-excluded从rsync选项中--delete-excluded --exclude-from=$EXCL_FROM删除。
  3. 在rsync选项中包含-FF
  4. 在调用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'