我想在 Debian 系统上使用 bash 脚本或 shell 复制和rsync
同步目录--delete
。--delete-excluded
目录一开始没有同步,也就是说源里的文件被删除了。
我检查了这两个帖子,后来意识到这是由于*
。
src/
因此,src/.
和之间存在差异src/*
这与隐藏文件或类似的东西无关。
为什么选项 1 的处理方式在逻辑上与选项 2 和 3 不同?
选项 1(不起作用):
rsync -avr src/* dst/ --delete-excluded
rsync -avr src/* dst/ --delete
选项 2(有效):
rsync -avr src/ dst/ --delete-excluded
rsync -avr src/ dst/ --delete
选项 3(有效):
rsync -avr src/. dst/ --delete-excluded
rsync -avr src/. dst/ --delete
当我删除 中的文件和目录时src
,它们不会被删除/同步/*
,但它们会被删除/同步/
和/.
。
来自 man rsync:
--delete 这会告诉 rsync 从接收端删除无关文件(不在发送端的文件),但仅限于正在同步的目录。您必须要求 rsync 发送整个目录(例如 lqdirrq 或 lqdir/rq),而不使用通配符来表示目录的内容(例如 lqdir/*rq),因为通配符由 shell 扩展,因此 rsync 会收到传输单个文件的请求,而不是文件的父目录。除非您使用 --delete-excluded 选项或将规则标记为仅在发送端匹配(请参阅 FILTER RULES 部分中的 include/exclude 修饰符),否则从传输中排除的文件也不会被删除。
这基本上不是同一件事吗?
rsync 看到的是,由于 shell 扩展了 a/*,rsync 不再知道父文件夹 a/ – 它只接收文件/子目录的列表。它只将传递的文件与目标进行比较,而不是整体状态。--delete 无法可靠地删除,因为 rsync 不知道 a/ 中应该有什么。
主目录是用 指定的src/
,src/.
这src/*
在逻辑上是否正确,我不明白?