我正在尝试使用#recycle
rsync 排除该目录:
$ 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 31
bash
4.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
选项将结果写入日志文件。