试图从我们收购的受到严重感染的 Windows XP 和 2003 计算机中安全地检索文件。我也有类似的需求,需要自动执行一个脚本,该脚本将在 PXE 引导的 DRBL 机器上运行以 rsync 到我们的服务器。
以下代码导致单引号将整个 '--filter=''' 参数包裹到 rsync。注意 echo 去掉了单引号,但 rsync 没有。我究竟做错了什么?将每个参数都作为数组中的一个条目会有帮助吗?
失败,因为包装单引号:
'--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\'' '
当我运行完全相同的命令但手动删除包装单引号时,rsync 运行良好。
作品:
--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\''
尝试过不使用和不使用 --protect-args。
#!/bin/sh -x
PROTECTARGS=--protect-args
EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
echo EXCLUDE="${EXCLUDE[*]}"
FILTER=()
for X in "${EXCLUDE[@]}"; do
FILTER=( "${FILTER[@]}" "--filter='${X}' " );
done;
echo FILTER="${FILTER[*]}"
if [ "1" == "1" ]; then
rsync --dry-run -vv --stats \
--recursive \
"$PROTECTARGS" \
"${FILTER[*]}" \
'/hddOld/Documents and Settings' \
'/hddNew/'
fi;
输出:
FILTER=--filter='- "Default User/"' --filter='- "Application Data/"'
+ '[' 1 == 1 ']'
+ rsync --dry-run -vv --stats --recursive --protect-args '--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\'' ' '/hddOld/Documents and Settings' /hddNew/
Unknown filter rule: `'- "Default User/"' --filter='- "Application Data/"' '
rsync error: syntax or usage error (code 1) at exclude.c(817) [client=3.0.6]
bash-4.1.2-14.el6.x86_64
rsync version 3.0.6 protocol version 30
rsync-3.0.6-9.el6.x86_64
CentOS 6.4 x64
工作......不,它不:
FILTER+=( --filter=""${X}"" );
RESULTS IN:
'--filter=- "Default User/" --filter=- "Application Data/"'
rsync 并没有抱怨这个过滤规则,但实际上并没有过滤掉“Application Data/”。
你有两个问题:
首先,不要在其中使用引号
--filter
(尤其--protect-args
是说使用它来避免必须转义空格,尽管我在这里的测试表明双引号在没有它的情况下也是按字面意思使用的)。过滤器应该是- Application Data/
. 正如您用引号编写的那样,它正在寻找名为"
文件夹中的文件"Application Data
另一个问题是您希望每个过滤器都是一个单独的参数,因此在命令中
rsync
使用@
而不是:*
测试:
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
rsync version 3.0.7 protocol version 30
我创建了一个数组
arr=(a b "c d")
,然后用来touch "${arr[@]}"
创建文件在
dir1
。复制到.
a
_b
dir2
复制所有文件,因为 rsync 正在寻找文件名
"c d"
中带有引号的文件。还测试了使用mkdir
and- c d/
以- "c d/"
确保目录过滤器没有不同的工作方式,并且"c d/"
在排除目录的同时不排除目录c d/
。我通过这样做让它工作:
我变了:
至
这删除了双引号并在“-”之后使用了备用下划线“_”语法。先前的回答表明了这一点,但我必须添加“_”语法才能让它为我工作。
也改变了:
至
这从 X 变量替换周围删除了撇号。
并改变了:
至
这导致数组的每个元素都被视为单个参数,而不是前面提到的整个数组。