我有一个如下所示的源目录(src 和 bin 目录内有许多子目录):
- 顶部目录
- 项目1
- 源码/
- 垃圾桶/
- 脚本/
- 某个文件.txt
- 项目2
- 源码/
- 垃圾桶/
- 目标
- 垃圾桶/
- 文件.xml
- 项目1
我想将项目目录下的 bin 目录(即忽略 top_dir/proj2/target/bin/)及其内容 rsync 到目标目录,使其看起来像这样:
- 顶部目录
- 项目1
- 垃圾桶
- 项目2
- 垃圾桶
- 项目1
我可能可以通过在 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 通配符模式,它以递归方式搜索名为 的目录bin
。top_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-found
man rsync
答案2
您可以src
使用排除所有目录--exclude src/