我正在尝试#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
version和version 。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/ONE_PIECE/SOURCES_HD59iDF/EPISODES_666-709/
Extension_1/#recycle/SERIES/ONE_PIECE/SOURCES_HD59iDF/EPISODES_666-709/TOEI_ONE-PIECE_EP681-FN_TXT-JAP-V2-2018_169-177_1080i29-422_20-JAP-INT_XX_RXX_1811TVS1652.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/ONE_PIECE/SOURCES_HD59iDF/EPISODES_666-709/
Extension_1/#recycle/SERIES/ONE_PIECE/SOURCES_HD59iDF/EPISODES_666-709/TOEI_ONE-PIECE_EP681-FN_TXT-JAP-V2-2018_169-177_1080i29-422_20-JAP-INT_XX_RXX_1811TVS1652.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 - 额外的
'
不能用于变量[#]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/ONE_PIECE/SOURCES_VF/EPISODES_700-765/
我要回答这个问题,说使用
rsync
版本 3.1.3 协议 31 我无法重现最初描述的问题。(Raspbian GNU/Linux 10 “破坏者”。)修改后的问题显示排除列表不正确,将与目录名称不匹配。您已将单引号放入模式名称中,这些与目录/文件名不匹配。因此,他们不会被排除在外。
原始答案在下面继续。
但是,我看到 StackOverflow 上报告了另一个未解决的实例,该实例包含
#
导致问题的文件名 - 请参阅rsync failed to exclude '#filename#' file names,因此您并不孤单。也许它已被我正在运行的更高版本修复?设想
现在命令
输出
唯一重要的变化是我引用了排除模式,因此 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
)然后将stdout/stderr重定向到日志文件。替换-P
为--partial
或使用--log
选项将结果写入日志文件。