rsync不会删除目标文件


22

我正在尝试将目录更改为另一个目录。我的问题是,如果源目录中不再存在文件,则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'选项?


注意源目录末尾的/ *。这将导致rsync仅考虑那些文件,而不考虑目录本身(以及缺少不再存在的文件)。
Walt Stoneburner

Answers:


9

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

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


23

删除*。如rsync手册页中所述,该--delete选项不适用于通配符条目。

使用此代替:

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

“ --delete这告诉rsync从接收端删除无关的文件(不在发送端的文件),但仅针对正在同步的目录。 您必须要求rsync发送整个目录(例如dirdir/),而不使用通配符的目录的内容(例如dir/*)由于通配符由壳膨胀和rsync从而得到传送单个文件,而不是文件的父目录的请求。 该被排除在传输文件也被排除从感除非您使用该--delete-excluded选项或将规则标记为仅与发送方匹配,否则将其删除(请参阅“过滤规则”部分中的“包含/排除”修饰符)。


从功能上讲,这与Sven从2011
以来

8

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.