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

标签 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 规则,其他所有内容都被完全忽略。

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

如有任何帮助或建议,我们将不胜感激。

最佳答案

如果你想从 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/**/. 中的扩展值。

关于linux - rsync 使用 shopt globstar 和 **/。 - 如何排除目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899888/

相关文章:

linux - Linux Crontab 中新备份覆盖旧备份

mysql - Docker 无法启动没有这样的文件或目录的容器

linux - 如何在 ubuntu 12.04 机器上运行 .exe 文件?

linux - 禁用终端命令

linux - Shopify + Ubuntu 12.04LTS + Faraday issue = 可以使用旧版 OpenSSL 吗?

linux - 如何查看和删除 Kafka 主题

linux - 将变量从 makefile 传递到 docker compose 文件?

bash - 如何比较两条相对于空间相反的线

bash - 为什么 shell 命令没有按我预期的顺序执行?

linux - 如何使用 bash 脚本计算单词中出现次数最多的 3 个字母序列