对 shell 变量中的 rsync 过滤器感到困惑

对 shell 变量中的 rsync 过滤器感到困惑

rync 过滤器让我很困惑,它们似乎是专门设计用来以最令人困惑的方式与 bash shell 表达式进行交互的。例如,

FILTERS="-f'- *.mov'"

扩展为'-f'\''- *.mov'\''' 产生未知的过滤规则:'- *.mov''

FILTERS="-f\'- \*.mov\'"

扩展为,'-f\'\''- \*.mov\'\''' 结果相同

ETC

如果您只是rsync ... -f'- *.mov'在命令行上输入,过滤器就会按预期工作。

有没有合理的方法将过滤表达式传递给 rsync?只是想从 rsync 中排除所有 *mov 文件。

答案1

如果-f'- *.mov'工作正常,以下操作也应该有效:

FILTERS='-f- *.mov'
rsync ... "$FILTERS"

shell 会从工作表达式中删除单引号,但它们会阻止单词在空格处拆分,以及通配符的扩展。用双引号括住变量可达到相同的效果。

答案2

好吧,我放弃了,并使用了 rsync 排除文件。这很有效,而且不那么令人困惑:

创建一个名为 $HOME/.rsync-filter 的文件,内容如下:- *.mov

您可以使用 shell 变量:FILTERS="merge $HOME/.rsync-filter"

然后这个命令:rsync -avRlh --delete --delete-excluded --no-links -f="$FILTERS" $FOLDERS /mnt/something

如果愿意的话,您可以将排除文件作为此处文件放入 shell 脚本中。

相关内容