我如何 rsync 一组子目录?

我如何 rsync 一组子目录?

我有一个如下所示的源目录(src 和 bin 目录内有许多子目录):

  • 顶部目录
    • 项目1
      • 源码/
      • 垃圾桶/
      • 脚本/
      • 某个文件.txt
    • 项目2
      • 源码/
      • 垃圾桶/
      • 目标
        • 垃圾桶/
      • 文件.xml

我想将项目目录下的 bin 目录(即忽略 top_dir/proj2/target/bin/)及其内容 rsync 到目标目录,使其看起来像这样:

  • 顶部目录
    • 项目1
      • 垃圾桶
    • 项目2
      • 垃圾桶

我可能可以通过在 include-from 文件中明确列出每个 bin 目录(在我的真实场景中大约有 15 个)来使其工作,但我想必须有一种方法来表示我想同步所有 top_dir/*/bin 目录。

答案1

可能性 1

使用 shell 扩展1 代替rsync的过滤规则,可以执行以下操作:

a. 要包含层次结构bin中的所有目录top_dir

rsync -av -R top_dir/**/bin/ destination_path

-R是 rsync 2参数,代表相对的.man rsync解释为

使用相对路径。这意味着将命令行上指定的完整路径名发送到服务器,而不仅仅是文件名的最后部分。当您想同时发送几个不同的目录时,这特别有用。

但本质上这意味着目录结构被保留。

**是一个 shell 通配符模式,它以递归方式搜索名为 的目录bintop_dir因此,对于上述示例,命令行将扩展为:

rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path

b. 如果您只想包含bin项目目录下一级的目录,只需使用一个*(也适用于“古老”的 shell!):

rsync -av -R top_dir/*/bin/ destination_path

1您需要最近的狂欢版本 (>4) 并通过 激活递归通配符shopts -s globstar。使用递归通配是默认的。

2 Linux 上的 rsync 版本 v3.2.3 协议版本 31。

可能性 2

仅使用您需要的 rsync 过滤规则:

a. 要包含层次结构bin中的所有目录top_dir

rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path

第一条include规则可能不明显3/但保证搜索所有目录(注意尾随的),第二条规则添加bin目录中的所有内容,exclude其他所有内容排除。-m确保不复制空目录。

b. 仅包含项目目录下的一个级别:

rsync -av -m  --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path

使用rsync >= 2.6.7 的语法。模式中的***前导表示,否则模式将与/top_dir结尾文件路径。


3搜索/some/path/this-file-will-not-be-foundman rsync

答案2

您可以src使用排除所有目录--exclude src/

相关内容