Rsync:有什么方法可以快速排除多个文件和目录吗?

Rsync:有什么方法可以快速排除多个文件和目录吗?

有没有办法使用 rsync 快速排除多个文件和目录?

下面是我的代码:

rsync -avzh . blabla@blabla:~/ --exclude=__pycache__ --exclude=checkpoints --exclude=logs --exclude=.git --exclude=plot

我必须为每个文件(目录)明确声明。我感觉太长了

答案1

rsync(请参阅 参考资料man rsync)的文档具有--exclude-from允许您在文件中指定排除列表的参数。

关于您的一组示例排除项,目录后应带有 ,/以显示它们是目录而不是未指定的文件或目录,并且那些仅位于您的主目录本身的目录应带有前缀 ,/以便它们与其他任何地方都不匹配。

在排除文件中,它们可以像这样列出

# Directories found anywhere
__pycache__/
checkpoints/
logs/
plot/

# Directories found only in HOME
/.git/

答案2

如果您正在使用bash,您可以使用大括号扩展它扩展到多个--exclude=xxx选项:

rsync -avzh --exclude={__pycache__,checkpoints,logs,.git,plot} . blabla@blabla:~/ 

答案3

除非您可以制定一个与您想要排除的所有可能的目录/文件相匹配的模式,否则我能想到的唯一其他方法是从带有--exclude-from=filename.

您还可以将模式存储在数组中(在支持此功能的 shell 中,例如zshbashkshyash),如果您正在编写脚本,这可能会很有用:

exclude=( __pycache__ checkpoints logs .git plot )

for pattern in "${exclude[@]}"; do
    exclude=( "${exclude[@]:1}" --exclude="$pattern" )
done

rsync --archive --verbose --compress --human-readable \
    "${exclude[@]}" \
    . blabla@blabla:

或者使用位置参数(更少的输入,并且可移植到所有 POSIX shell):

set -- __pycache__ checkpoints logs .git plot

for pattern do
    set -- "$@" --exclude="$pattern"
    shift
done

rsync --archive --verbose --compress --human-readable \
    "$@" \
    . blabla@blabla:

相关内容