我在Linux系统上使用rsync来同步本地磁盘和连接的USB驱动器之间的目录。 我遇到的问题是,在服务器上每天创build备份的第三方系统实际上会更改嵌套在备份深处的目录的名称。 该目录具有备份中所需的大部分数据。 当rsync查看目录时,它看到名称已经改变,并认为它是一个全新的目录。 所以我的USB驱动器的rsync拷贝每天都有一个新的目录运行。
我已经写了脚本,实际上会改变目录名称,但这是一个麻烦的做法!
我正在寻找一个“优雅”的方式来处理这个问题。 是否可以创build一个链接到保持不变的目录? rsync可以configuration为检测该目录是否相同,即使该名称已更改? 我相信以前有人不得不面对这个!
一种方法是分两步做。 第一,通过使用忽略模式,rsync除了目录之外的所有东西。 第二,rsync只是在bash中使用globbing的目录来到目录,像这样:
rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/
在源目录中使用尾部的斜杠将有效地导致rsync忽略目录名称,因为它将在目录的内容而不是目录本身上被调用。 当然,如果这个目录是用一个不变的前缀或者后缀来命名的话,那么这个通配符将是最简单的。 如果不是,你可以编写一个脚本来找出目录的实际名称,然后做更直接的事情:
rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/
最后,你的伪代码是这样的:
您可以使用rsync选项–compare-dest = DIR ,– copy-dest = DIR或–link-dest = DIR 。 它们允许您在接收端指定一个额外的目录来查找丢失的文件。
例如,使用–link-dest,rsync将创build包含已更改文件的新副本的目录的新版本,否则将创build没有的文件的硬链接副本。
要使用这些选项中的任何一个,您必须从以前的rsync运行中知道usb驱动器上的目录名称,因此您可能需要将rsync包装在脚本中,该脚本首先计算出正确的目录名称。
创build新版本后,您可能也想使用–delete-after删除旧版本的目录。
单独的Rsync不能做你想做的,因为唯一的元数据rsync可用是目录名称和MACtimes。
在rsync中自动处理它的唯一方法是rsync以某种方式有更多的元数据。 例如,微软在Windows上的DFS复制通过使用分配给NTFS卷中的文件的唯一ID来处理,以便在文件(或目录)名称更改时进行捕获。
你不雅的脚本可能是最简单的方法来做你想要的W / O转储rsync和寻找另一种工具。
使用符号链接不起作用,因为联结点与目标目录的名称绑定(在这种情况下目标目录名称将会更改)。 您可以使用硬链接(与inode绑定),但是您需要确保目录名称正在更改,而不仅仅是删除和重新创build(这将分配一个不同的inode)。