排除具有要由rsync

时间:2016-06-30 10:22:52

标签: zsh rsync

问题:从Zsh脚本调用rsync,我想告诉rsync排除具有某组扩展名的文件。我现在这样做的方式是:

rsync -r --exclude '*.bak' --exclude '*.save' --exclude '*.backup' --exclude '*.old' ... from_directory/* to_directory

这写起来很乏味,命令行也很冗长。我尝试了另类

# THIS DOES NOT WORK:
rsync -r --exclude '*.bak' --exclude '*.{save,backup,old,...}' from_directory/* to_directory

但这不起作用 - rsync不使用花括号来处理捷径(这并不奇怪,因为即使在shell级别,这也不是文件globbing的一部分,而是发生在解释命令行的早期阶段。)

我还考虑将要排除的所有模式编写到文件中,并使用--exclude-list代替--exclude。这可行,但我不喜欢这个解决方案,因为我希望我的脚本是自包含的,即文件模式在脚本中可见,而不是在单独的文件中。

当然,总有一种解决方案可以使用HERE文档创建包含扩展名的临时文件:

cat <<<LIST >excluded.txt
*.bak
*.save
... etc
LIST
rsync -r --exclude-list excluded.txt ....
rm excluded.txt

但我想知道是否有一个更优雅的解决方案,通过一些聪明的使用rsync选项,或通过一些Zsh功能,这使得处理临时文件更容易。

1 个答案:

答案 0 :(得分:2)

您尝试的替代方法不起作用,因为大括号扩展(foo{a,b,c}barfooabar foobbar foocbar)不适用于引号括号。

请尝试以下方法。

rsync -r --exclude='*'.{bak,save,backup,old} from_directory/* to_directory

诀窍是仅引用*,并使用--exclude选项的值也可以用=而不是空格分隔的事实。这样zsh将其视为一个单词并

--exclude='*'.{bak,save,backup,old}

将扩展为

--exclude='*'.bak --exclude='*'.save --exclude='*'.backup --exclude='*'.old