【问题标题】:How can I prevent a directory from being removed in rsync如何防止在 rsync 中删除目录
【发布时间】:2013-05-23 14:52:39
【问题描述】:

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

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

【问题讨论】:

  • 你解决过这个问题吗?我不清楚您要做什么 - 备份备份?
  • 不,我从来没有这样做过。我正在尝试进行常规镜像备份,但还将备份中将删除的所有文件移动到一个特殊目录,以便我可以撤消任何意外删除的内容。
  • 也许考虑使用 rsync 的 -n 或 --dry-run 选项来看看它会做什么,然后复制将在 rsync 的实际运行中删除的数据?

标签: linux bash shell backup rsync


【解决方案1】:

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

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

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

在您的情况下,由于您的规则从双方排除文件,rsync 不会删除它们。然后使用--delete-excluded 强制删除。但是,就像你说的,这个选项与@​​987654323@ 冲突。

我建议您执行以下操作。

  1. $EXCL_FROM转换为普通的过滤器文件,即在每行之前插入减号以使其排除规则。
  2. 从 rsync 选项中删除 --exclude-from=$EXCL_FROM--delete-excluded
  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'

【讨论】:

  • 我更新了答案,澄清了-FF。如果不清楚,请随时询问。
  • 谢谢。我已添加列表格式摘要(等待同​​行评审)并接受您的回答。
  • 不客气。顺便说一句,您似乎对答案投了赞成票,但没有接受。
  • 嗯?我记得以列表格式接受和编辑。现在也没有了。 Stack Overflow 有没有及时回到过去?此列表摘要与此答案结合使用确实很有帮助,但我不想再次阅读手册。不过,我会再次接受您的回答。 :)
【解决方案2】:

另一种方法是使用绝对路径(用../ 指定)将--backup-dir 定位在备份文件夹之外。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2016-08-22
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多