以下是我采取的步骤:
创建一些测试文件:
/tmp $ mkdir src tgt
/tmp $ cd src/
/tmp/src $ touch .test{1,2,3}
/tmp/src $ ls -la
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:02 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
同步 src 和 tgt 目录:
/tmp/src $ cd ..
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
3 files to consider
.test1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/3)
.test2
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/3)
.test3
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=0/3)
sent 209 bytes received 86 bytes 590.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
删除src中的一个文件并再次同步:
/tmp $ rm -rf src/.test1
/tmp $ ls -la src/
total 0
drwxr-xr-x 4 user wheel 136 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
2 files to consider
sent 75 bytes received 20 bytes 190.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
tgt 目录中的 .test1 文件未被删除。
为什么在这种情况下 --delete 选项不起作用?
如何让 rsync 命令删除目标中的隐藏文件?
答案1
这与隐藏文件无关。rm
你从未被告知rsync
要关心src/.test1
它。来自man 1 rsync
[强调我的]:
--delete
这告诉rsync
从接收方删除多余的文件(不在发送方的文件),但是仅适用于正在同步的目录。您必须要求rsync
发送整个目录(例如dir
或dir/
),而不使用通配符来表示目录的内容(例如dir/*
)因为通配符被 shell 扩展,rsync
因此会得到传输单个文件的请求,而不是文件的父目录。[…]
同步目录,而不是单个文件:
rsync -avh --delete --progress src/ tgt
答案2
诀窍是同步目录(如@Kamil Maciorowski 所述),但也使用包含和排除过滤器,因此首先只同步点文件:
rsync -avh --delete --progress --include'.*'--exclude'*'src/tgt
答案3
就我而言,添加后--ignore-errors
问题就解决了。
更多详细信息:使用 cygwin 从 Linux 服务器复制到 Windows USB 驱动器。
源是server:/src
,目的地是/cygdrive/e
。
上次 rsync 运行后留下了一个隐藏文件。文件名类似于.data.qpSS6L
运行以下命令不是删除文件:
rsync -rvvth --update server:/src /cygdrive/e --delete
以下添加--ignore-errors并正确删除隐藏文件:
rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors