Rsync 排除文件夹

Rsync 排除文件夹

我正在运行 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,例如shdash)有一个未命名数组(位置参数$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

相关内容