我尝试准备 rsync 命令,它将:1. 备份目录中的所有文件(但不备份嵌套文件)2. 备份某些目录3. 当源目录中的文件被删除时,也删除目标目录中的文件
rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/
但这仅复制文件,不复制任何文件夹,也不删除。你能帮我改进一下命令吗?
答案1
严格来说,以下可以被解释为矛盾的目标。
- 备份目录下的所有文件但不是嵌套文件即——排除='*/'
- 备份某些目录 - 即包括一些嵌套文件
请参阅下面的解释,了解为什么您的论点没有按照您的预期发挥作用。下面,请参阅可能适合您目的的合适替代方案(它满足#1、#3 和#2 的版本)。
为什么你的命令不起作用:
rsync 处理命令行参数的方式,以下参数相当于说 --exclude='*/'
--排除='/'--include='所需的子文件夹/'
即,您的命令排除了所有嵌套文件,从而也排除了所需子文件夹中的文件。
此问题会影响您的第二个观察结果,即在源中删除的目标中的文件不会被删除。实际上,您的命令在删除顶层此类文件方面效果非常好。但是,下一级的文件不会被删除,因为它们已被排除。记住 --delete 指的是 --delete-during,而不是 --delete-before。
满足 #1、#3 和 #2 版本的解决方案: 以下解决方案可能适合您的需求
rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/
它满足以下条件: 1. 备份深度为 1 的所有文件和目录,但不备份嵌套文件。 2. 备份所需文件夹 3. 删除目标中不在源中的文件。
另一种比较麻烦的选择如下
rsync -vlptgoDd --delete src/ dest/
这满足#1 和#3,但避免所有嵌套文件(请记住,文件夹也是 *nix 中的文件)。我避免给出 -r 选项,因此它不是递归的。删除作品并复制深度为 1 的文件夹。除了保留时间戳 (-t) 之外,我还包含了用于存档复制的其他典型选项。
在不同文件夹中获取不同 rsync 行为的更标准方法是通过层次结构以每个目录的方式散布过滤规则;即创建特定于需要独特行为的每个文件夹的 .rsync-filter 文件。例如
rsync -avF src/ dest/