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 脚本中。