如何从Git Diff输出的文件路径中提取顶级目录
提取git diff路径中的顶级目录
需求说明
给定git diff输出的文件路径列表:
.github/lint-checker/.eslintrc.js Calendly/code/src/function-factory.ts Calendly/code/src/functions/common/utils.ts Calendly/code/src/functions/sync_calendar/main.ts
需要提取唯一的顶级目录/路径段,输出:
.github/lint-checker/ Calendly
实现方法
方法1:awk处理(推荐)
结合字段分割与条件判断,最后去重:
git diff --name-only | awk -F '/' ' $1 ~ /^\./ { print $1 "/" $2 "/" } $1 !~ /^\./ { print $1 } ' | sort -u
- 逻辑:
- 以
/为分隔符拆分路径 - 若第一个字段以
.开头(隐藏目录),输出前两级目录并保留结尾斜杠 - 若为普通目录,直接输出第一级目录
sort -u确保每个顶级路径仅出现一次
- 以
方法2:sed+sort处理
通过正则匹配提取目标路径:
git diff --name-only | sed -E ' s/^\.([^/]+)\/([^/]+)\/.*/.\1\/\2\// s/^([^./][^/]+)\/.*/\1/ ' | sort -u
- 逻辑:
- 第一条规则匹配隐藏目录开头的路径,提取前两级目录
- 第二条规则匹配普通目录开头的路径,提取第一级目录
- 同样用
sort -u去重
方法3:纯Shell脚本
利用Shell参数扩展实现,无需外部工具:
git diff --name-only | while read -r path; do if [[ $path == ./* ]]; then dir="${path%%/*/*/*}" echo "$dir/" else dir="${path%%/*}" echo "$dir" fi done | sort -u
- 逻辑:
- 判断路径是否以隐藏目录开头
${path%%/*/*/*}截取前两级目录(移除第三个/及后续内容)${path%%/*}截取第一级目录(移除第一个/及后续内容)- 最后去重
内容的提问来源于stack exchange,提问作者goozilla
相关产品推荐
相关产品推荐

