我正在运行 rsync 脚本,并且我想排除某些文件夹。我知道使用 rsync 您必须创建一个.txt
文件并在其中添加所有排除项,但我想知道是否可以在脚本中包含一个全局字符串,其中包含我想要的所有排除项,然后将该全局字符串添加到 rsync 命令中?
全局字符串示例
ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exlucde=/mnt --exlcude=/media
Rsync命令
rsync -au --exclude 'ROOT_EXCLUDE' /Users/Me/Home /Users/me/Backup
答案1
如果排除列表的元素不包含任何空格或任何通配符,您可以定义一个ROOT_EXCLUDE
变量并使用它(不加引号)。不带引号的变量扩展在每个空白序列处分割变量的值;那么如果每个元素包含任何通配符,则将其扩展为通配符模式。
ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exclude=/mnt --exclude=/media"
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup
如果您想在排除列表中使用通配符,那么只要您没有名称与模式匹配的文件,这将在标准 shell 中起作用。对于像这样的词来说,这是一个狡猾的假设,--exclude=*.bak
如果你写 ,通常情况并非如此--exclude *.bak
。为了避免这个陷阱,您可以关闭通配符扩展。
ROOT_EXCLUDE="--exclude=/dev --exclude=*.bak"
set -f
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup
set +f
在支持数组的 shell 中(ksh、bash、zsh,但不支持普通 sh),您可以将参数列表放在大批。这是将参数列表填充到变量中的推荐方法。
#!/bin/bash
…
ROOT_EXCLUDE=('--exclude=/dev' '--exclude=*.bak')
rsync -au "${ROOT_EXCLUDE[@]}" /Users/Me/Home /Users/me/Backup
普通 sh(任何 Bourne/POSIX shell,例如sh
或dash
)有一个未命名数组(位置参数$1
、$2
、...),您可以使用 进行设置set -- …
。如果需要临时更改位置参数,请在函数中进行临时更改:每个函数调用都有自己的一组位置参数。
set -- '--exclude=/dev' '--exclude=*.bak'
rsync -au "$@" /Users/Me/Home /Users/me/Backup
-x
您应该传递选项来跳过挂载点,而不是列出要排除的目录列表。这将处理/proc
、/sys
等。但是,如果您想跨多个分区备份文件,则需要显式包含所有源。如果您要备份主目录,则可能没有内存中的文件系统可以跳过,但可能有网络文件系统或其他 FUSE 文件系统。
rsync -ax /Users/Me/Home /Users/me/Backup
1更一般地说,基于 的值IFS
。