如何让--exclude-ext仅对特定目录生效?能否仅排除特定目录的*.c文件?
针对文件排除规则的两个问题解决方案
嘿,针对你提出的这两个关于文件排除规则的问题,我来给你拆解一下实用的解决方案:
1. 让--exclude-ext参数仅对部分特定目录生效
其实大多数带--exclude-ext参数的工具(比如rsync、fd、ripgrep这类),默认都是全局生效的,但咱们可以通过组合路径限定的排除规则来实现只让它在特定目录起作用,而不是全局覆盖。
举个实际例子:假设你想让.log后缀的文件只在./temp/和./cache/这两个目录下被排除,其他目录的.log文件不受影响,用rsync的话可以这么写命令:
rsync -av --exclude='temp/**/*.log' --exclude='cache/**/*.log' source/ destination/
如果用的是fd这类支持灵活规则的工具,命令类似:
fd --exclude 'temp/**/*.log' --exclude 'cache/**/*.log' .
要是规则太多,你还可以把这些规则写到一个文件里(比如exclude-rules.txt):
temp/**/*.log cache/**/*.log
然后用工具的--exclude-from参数加载这个文件,比如:
rsync -av --exclude-from='exclude-rules.txt' source/ destination/
这样管理规则会更清晰。
2. 仅从指定的目录/子目录中排除*.c文件
这个需求的核心就是精准锁定要排除的目录范围,而不是全局排除所有.c文件,同样可以用「路径+后缀」的组合规则来实现,不同工具的写法大同小异:
场景1:用rsync同步文件时
假设你要排除./src/legacy/和./tests/old/这两个目录下的所有.c文件,其他目录的.c文件正常同步,命令如下:
rsync -av --exclude='src/legacy/**/*.c' --exclude='tests/old/**/*.c' source/ destination/
场景2:用git管理版本时
在项目根目录的.gitignore文件里添加这两行规则即可:
src/legacy/**/*.c tests/old/**/*.c
这样git只会忽略指定目录下的.c文件,其他目录的.c文件依然会被追踪。
通用思路总结
不管用什么工具,核心逻辑都是给后缀排除规则加上具体的目录路径前缀,以此限定规则的作用范围。如果工具本身不支持直接给--exclude-ext绑定目录,直接写完整的路径匹配规则,效果是完全一样的。
内容的提问来源于stack exchange,提问作者user5326167
相关产品推荐
相关产品推荐

