Bash中如何优雅过滤Git文件列表 仅保留存在对应.spec.js的文件
优化方案
场景说明
需求为统计Git历史中改动频次最高、且当前存在同名.spec.js测试文件的.js源文件,用于优先推进spec测试格式转test格式的工作。
原有可用命令存在重复遍历重复文件条目做存在性校验的问题,优化后命令如下:
git log --pretty=format: --name-only -- '*.js' \ | grep -vE '\.(spec|test)\.js$' \ | sort | uniq -c \ | while read -r count file; do [ -f "${file%.js}.spec.js" ] && printf "%s %s\n" "$count" "$file" done \ | sort -rg | head -25
方案优势
- 先对git输出的文件列表做去重统计,仅对唯一文件名执行一次存在性判断,避免重复IO操作,执行效率更高
- 全程使用shell内置的文件测试符
[ -f ]做存在性校验,不依赖ls命令,兼容性更好 - 新增路径过滤参数
-- '*.js',让git log仅输出js类文件,减少无关文件的处理开销 - 新增grep规则过滤掉
.spec.js、.test.js测试文件本身,避免把测试文件计入待转换的源文件列表 - 变量加引号包裹、使用
read -r读取文件名,可兼容带空格的特殊文件名场景
极致简洁的单行版本如下:
git log --pretty=format: --name-only -- '*.js'|grep -vE '\.(spec|test)\.js$'|sort|uniq -c|while read c f;do [ -f "${f%.js}.spec.js" ]&&echo $c $f;done|sort -rg|head -25
内容的提问来源于stack exchange,提问作者AncientSwordRage
相关产品推荐
相关产品推荐

