我已阅读rsync文档并查看了此处的线程,但找不到符合我的要求的简单匹配。
我希望将多个目录/文件从源复制到目标目录。我想要增量复制,但我想从目标中删除其他任何内容。因此,在目标中,我们最终会得到指定源的精确备份,而不会得到其他任何内容。
#!/bin/bash
mkdir -p source/{A,B,C,D}
touch source/{A,B,C,D}/file
mkdir -p /tmp/dest/{A,B,E,F}
touch /tmp/dest/{A,B,E,F}/file
cd source
rsync -av --delete A B /tmp/dest/
我希望/tmp/dest
最后只剩下和 A
,B
所以E
和F
应该被删除 ---但它们并没有。请注意,我不希望从源中复制C
和D
。请注意,我不知道目的地(或源)可能还有什么或可能没有什么。
这似乎是备份某些选择性内容并使目标仅包含所请求内容的常见要求。请问有人有具体的命令吗?
您应该在使用包含和排除过滤器
source
同步dest
时准确指定您想要的内容。当您将
A
和B
从内source
同步到时dest
,实际上是将和 同步source/A
。dest/A
该实用程序不知道或下的任何其他目录,也不知道应如何处理它们。source/B
dest/B
source
dest
反而:
这要求在各种过滤器给出的约束范围内
rsync
使source
和相同。末尾的是必不可少的(没有它,您将得到一个目录),而目标路径末尾的 是为了确保它实际上是一个目录。过滤器以“第一个匹配获胜”的方式应用于下的每个名称。两个包含过滤器将匹配和子目录及其所有内容(递归)。排除过滤器将匹配其他任何内容。dest
/
source/
/tmp/dest/source
/
source
A
B
我们运行和
--delete
,这将删除目标--delete-excluded
下不应存在的文件(例如,和或或下的任何已删除的文件),并且它将删除与排除过滤器匹配的任何内容(例如,和,如果它们存在于下)。dest
E
F
A
B
C
D
dest
来自关于过滤表达式的评论:
在包含或排除过滤器中,
*
匹配目录中的任何名称,**
匹配目录中或目录下的任何名称,***
匹配目录中或目录下的任何名称,还匹配目录本身,即,A/***
并且B/***
匹配和 ,A
而B
不仅仅是它们的内容。如果我们使用A/**
andB/**
,这些目录将永远不会同步,因为模式A/**
不匹配A
且不B/**
匹配B
。手册中对此进行了描述
rsync(1)
。