我正在尝试将随时间变化的目录镜像到另一个目录。我的问题是 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
Run Code Online (Sandbox Code Playgroud)
这是输出:
+ 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
Run Code Online (Sandbox Code Playgroud)
如您所见,第二次运行 rsync 后,文件“a”仍然存在于目标目录中,这不是我所需要的。我是否滥用了“--delete”选项?
Sam*_*eer 30
删除*
. 如 rsync 手册页所述,该--delete
选项不适用于通配符条目。
改用这个:
rsync -a --delete $DIR1/ $DIR2/
Run Code Online (Sandbox Code Playgroud)
" --delete 这告诉 rsync 从接收端删除无关文件(那些不在发送端的文件),但只针对正在同步的目录。 您必须要求 rsync 发送整个目录(例如dir
或dir/
) 而不对目录的内容使用通配符(例如dir/*
),因为通配符被 shell 扩展,因此 rsync 会收到传输单个文件的请求,而不是文件的父目录。 从传输中排除的文件也被排除在外除非您使用该--delete-excluded
选项或将规则标记为仅在发送方匹配(请参阅过滤规则部分中的包含/排除修饰符)。”
小智 11
原因是因为你在 /tmp/1/b 上调用了 rsync,它根本不会考虑 /tmp/1/a 文件。
您的意图似乎是 rsync 目录 /tmp/1/ -- 如果您使用“/tmp/1/”作为源而不是单个文件,它会注意到“a”已从目录中删除并删除它来自目标。
如果您将第二个 rsync 行更改为rsync -a --delete $DIR1/ $DIR2
(不带 *),它将起作用。原因是外壳将 the 扩展为*
第一个目录中的文件名,在您的情况下仅为 b ,因此 rsync 根本不会考虑丢失的文件 a,因为执行的命令实际上是rsync -a --delete $DIR1/b $DIR2
.
归档时间: |
|
查看次数: |
39461 次 |
最近记录: |