You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:23:13