rsync 不会删除目标上的文件

rsync 不会删除目标上的文件

我正在尝试将随时间变化的目录镜像到另一个目录。我的问题是,如果源目录中不再存在文件,rsync 不会删除目标目录中的文件。这是一个演示脚本:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

输出如下:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

如您所见,在 rsync 第二次运行后,文件“a”仍然存在于目标目录中,这不是我需要的。我是否误用了“--delete”选项?

答案1

原因是您在 /tmp/1/b 上调用 rsync,而它根本不会考虑 /tmp/1/a 文件。

您的意图似乎是 rsync 目录 /tmp/1/ - 如果您使用“/tmp/1/”作为源而不是单个文件,它会注意到“a”已从目录中删除并将其从目标中删除。

答案2

删除*。正如 rsync 手册页中提到的那样,该--delete选项不适用于通配符条目。

改用这个:

rsync -a --delete $DIR1/ $DIR2/

“--delete 这告诉 rsync 从接收端删除多余的文件(不在发送端的文件),但仅限于正在同步的目录。 您必须要求 rsync 发送整个目录(例如dirdir/),而不使用目录内容的通配符(例如dir/*),因为通配符已被 shell 扩展,因此 rsync 会收到传输单个文件的请求,而不是文件的父目录。--delete-excluded除非您使用该选项或将规则标记为仅在发送方匹配(请参阅“过滤规则”部分中的包含/排除修饰符), 否则从传输中排除的文件也不会被删除。”

答案3

如果您将第二行 rsync 更改为rsync -a --delete $DIR1/ $DIR2(不带 *),它将起作用。原因是 shell 将 扩展*为第一个目录中的文件名,在您的情况下仅为 b,因此 rsync 根本不会考虑缺失的文件 a,因为执行的命令实际上是rsync -a --delete $DIR1/b $DIR2

相关内容