使用shopt globstar和** /的rsync。 - 如何排除目录?

时间:2013-09-19 16:13:54

标签: linux bash ubuntu-12.04 rsync

我正在尝试将大型目录结构中的所有文件同步到一个根目录中(即不创建子目录但仍包括所有递归文件)。

环境:

  • Ubuntu 12.04 x86
  • RSYNC版本3.0.9
  • GNU bash版本4.2.25(1)

到目前为止,我从一个bash脚本调用了这个命令,该脚本工作正常并提供了所需的基本核心功能:

shopt -s globstar
rsync -adv /path/to/source/**/. /path/to/dest/. --exclude-from=/myexcludefile

myexcludefile的内容是:

filename
*/ 
# the */ prevents all of the directories appearing in /path/to/dest/

# other failed attempts have included:
directory1
directory1/
directory1/*

我现在需要排除位于源树中某些目录内的文件。但是由于globstar方法查找所有目录,rsync无法匹配要排除的目录。换句话说,除了/*filename规则之外,其他所有内容都被完全忽略。

所以我正在寻找一些关于exlude语法的帮助,或者是否有另一种方法可以将许多目录的rsync实现到一个不使用我的globstar方法的目标目录中。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

如果要从globstar匹配中排除目录,可以将它们保存到数组中,然后根据文件过滤该数组的内容。

示例:

#!/bin/bash

shopt -s globstar

declare -A X
readarray -t XLIST < exclude_file.txt
for A in "${XLIST[@]}"; do
    X[$A]=.
done

DIRS=(/path/to/source/**/.)
for I in "${!DIRS[@]}"; do
    D=${DIRS[I]}
    [[ -n ${X[$D]} ]] && unset 'DIRS[I]'
done

rsync -adv "${DIRS[@]}" /path/to/dest/.

使用以下命令运行:

bash script.sh

请注意,exclude_file.txt中的值应与/path/to/source/**/.中的扩展值匹配。