rsync 不排除以井号字符 (#) 开头的指定目录

rsync 不排除以井号字符 (#) 开头的指定目录

我正在尝试使用#recyclersync 排除该目录:

$ rsync -Hauv -h -P --exclude '#recycle/' --exclude @eaDir/ --exclude '.DS_Store*' --exclude desktop.ini  user1@src_server:/volume2/Extension_1 /destination/dir/
receiving incremental file list
Extension_1/#recycle/subDir1/subDir2/
Extension_1/#recycle/subDir1/subDir2/BigVideo.mov
         39.23G  82%   36.40MB/s    0:03:44  ^C
$

(我也尝试引用.DS_Store*并删除该--log-file选项,但它们没有什么区别。)

我正在CentOS 7.9 上使用rsync版本.3.1.2 protocol version 31bash4.2.46(2)-release

更具体地说,我编写了一个非常小的脚本,其中包含一个包含排除列表的变量

$ rsyncExclusionOptions=$(printf -- "--exclude %s " "'#recycle/'" @eaDir/ "'.DS_Store*'" desktop.ini)
$ echo $rsyncExclusionOptions
--exclude '*/#recycle/' --exclude @eaDir/ --exclude '.DS_Store*' --exclude desktop.ini
$ rsync -Hauv -h -P --skip-compress=$rsyncSkipCompressList $rsyncExclusionOptions user1@src_server:/volume2/Extension_1 /destination/dir/
receiving incremental file list
Extension_1/#recycle/SERIES/mySerie/SOURCES_HD59iDF/EPISODES_666-709/
Extension_1/#recycle/SERIES/mySerie/SOURCES_HD59iDF/EPISODES_666-709/TOEI_myEpisode.mov
          3.22G   5%  104.35MB/s    0:08:23  ^CKilled by signal 2.

rsync error: unexplained error (code 255) at rsync.c(638) [generator=3.1.2]
rsync: [generator] write error: Broken pipe (32)
rsync error: received SIGUSR1 (code 19) at main.c(1430) [receiver=3.1.2]

EDIT0:@roaima 我也尝试放在#括号之间(如您提供的链接中所建议的)这里)但它也不起作用:

$ rsyncExclusionOptions=$(printf -- "--exclude %s " "'[#]recycle/'" @eaDir/ "'.DS_Store*'" desktop.ini)
$ echo $rsyncExclusionOptions
--exclude '[#]recycle/' --exclude @eaDir/ --exclude '.DS_Store*' --exclude desktop.ini
$ rsync -Hauv -h -P --skip-compress=$rsyncSkipCompressList $rsyncExclusionOptions user1@src_server:/volume2/Extension_1 /destination/dir/
receiving incremental file list
Extension_1/#recycle/SERIES/mySerie/SOURCES_HD59iDF/EPISODES_666-709/
Extension_1/#recycle/SERIES/mySerie/SOURCES_HD59iDF/EPISODES_666-709/TOEI_myEpisode.mov
          4.04G   7%   21.67MB/s    0:39:45  ^CKilled by signal 2.

rsync error: unexplained error (code 255) at rsync.c(638) [generator=3.1.2]
rsync: [generator] write error: Broken pipe (32)
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [receiver=3.1.2]
rsync: [receiver] write error: Broken pipe (32)

一个可行的解决方案:

  • 哈希值必须放在括号之间,如下所示:[#]AND
  • extra'不得用于变量[#]recycle内部的排除rsyncExclusionOptions
$ rsyncExclusionOptions=$(printf -- "--exclude %s " "[#]recycle/" @eaDir/ "'.DS_Store*'" desktop.ini)
$ echo $rsyncExclusionOptions
--exclude [#]recycle/ --exclude @eaDir/ --exclude '.DS_Store*' --exclude desktop.ini
$ rsync -Hauv -h -P --skip-compress=$rsyncSkipCompressList $rsyncExclusionOptions user1@src_server:/volume2/Extension_1 /destination/dir/
receiving incremental file list
Extension_1/SERIES/mySerie/SOURCES_VF/EPISODES_700-765/

答案1

我要回答这个问题是说,在rsync版本 3.1.3 协议 31 中,我无法重现最初描述的问题。 (Raspbian GNU/Linux 10“破坏者”。)

修改后的问题显示排除列表不正确,不会匹配目录名称。您已将单引号放入模式名称中,但它们与目录/文件名不匹配。因此,他们不会被排除在外。

原始答案继续如下。


但是,我发现 StackOverflow 上报告了另一个未解决的实例,其中包含#导致问题的文件名 - 请参阅rsync 无法排除“#filename#”文件名,所以你并不孤单。也许我运行的更高版本已经修复了?

设想

mkdir -p /tmp/718113/Extension_1/#recycle/subDir1/subDir2
cd /tmp/718113
mkdir dst
touch Extension_1/#recycle/subDir1/subDir2/BigVideo.mov

现在命令

rsync -Hauv -h -P --exclude '#recycle/' --exclude '@eaDir/' --exclude '.DS_Store*' --exclude 'desktop.ini' localhost:/tmp/718113/Extension_1 /tmp/718113/dst

输出

receiving incremental file list
Extension_1/

sent 85 bytes  received 78 bytes  326.00 bytes/sec
total size is 0  speedup is 0.00

唯一显着的变化是我引用了排除模式,以便 shell 没有机会扩展它们(特别但不排他'.DS_Store*')。但是,如果在本例中这是一个问题,您将会收到来自rsync诸如Unexpected remote arg: localhost:/tmp/718113/Extension_1和 的错误消息rsync error: syntax or usage error (code 1) at main.c(1372) [sender=3.1.3]

我还建议不要使用--progress(暗示-P)然后重定向标准输出/标准错误到日志文件。替换-P--partial或使用--log选项将结果写入日志文件。

相关内容