求助:使用Rsync仅复制匹配*000.csv模式文件的问题
解决rsync仅复制特定模式文件的问题
嘿,我完全懂你这种“明明逻辑对但就是跑不对”的抓狂!rsync的包含/排除规则确实有点反常识,我之前也在这上面踩过坑,给你捋捋怎么搞定这个需求。
为什么之前的方法失效?
你提到的“先排除所有再包含目标”思路是对的,但漏了关键一步:rsync默认会跳过未被明确包含的目录,如果目录都被排除了,它根本不会进去看里面的文件。所以必须先确保所有子目录都被包含,才能让rsync遍历到里面的*000.csv。
正确的rsync命令
直接用这条命令就能精准复制所有子目录里的*000.csv文件:
rsync -av --include='*/' --exclude='*' --include='*000.csv' /你的源目录路径/ /你的目标目录路径/
逐个参数解释
-av:a是归档模式,会保留文件权限、时间戳等元数据;v是详细输出,方便你查看哪些文件被复制了,排查问题更方便。--include='*/':先把所有层级的子目录都包含进来,让rsync能遍历到每个目录里的文件。--exclude='*':排除所有未被后续规则包含的文件,这一步是“兜底”,确保只留下我们要的文件。--include='*000.csv':最后明确包含所有匹配*000.csv的文件,这条规则会覆盖前面的排除规则。
注意事项
- 源目录路径末尾的斜杠
/很重要!如果不加,rsync会把源目录本身复制到目标目录里,而不是目录里的内容。比如/source和/source/的效果是不一样的。 - 如果你的
*000.csv文件只在特定层级的目录里,还可以调整--include='*/'的规则,比如用--include='dir*/'只包含以dir开头的目录,但你的需求是所有子目录,所以原命令完全适用。
举个实际例子,如果你的源目录结构是这样:
my_source/ ├── sales/ │ ├── jan000.csv │ └── jan123.csv ├── logs/ │ ├── 2024/ │ │ └── error000.csv │ └── access.log └── report000.csv
运行命令后,会复制jan000.csv、error000.csv和report000.csv,其他文件都会被排除,完美符合你的需求!
内容的提问来源于stack exchange,提问作者Jon Deaton
相关产品推荐
相关产品推荐

