Rsync --delete 选项不会删除目标中的隐藏点文件

Rsync --delete 选项不会删除目标中的隐藏点文件

以下是我采取的步骤:

创建一些测试文件:

/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发送整个目录(例如dirdir/),而不使用通配符来表示目录的内容(例如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

相关内容