问题:从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功能,这使得处理临时文件更容易。
答案 0 :(得分:2)
您尝试的替代方法不起作用,因为大括号扩展(foo{a,b,c}bar
→fooabar 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