如何按指定深度的目录分组展示文件列表摘要(含Git场景)
提取指定深度目录并汇总的方法
针对你需要从Git提交或diff的文件列表中按指定目录深度汇总的需求,这里有几个简单高效的shell命令方案:
方法1:使用awk提取指定深度目录
awk可以灵活按分隔符拆分路径,轻松指定要提取的目录层级:
提取一级目录(如foo/、bar/)
git diff --name-only | awk -F '/' '{print $1"/"}' | sort -u
-F '/':将路径的分隔符设为斜杠print $1"/":提取第一个目录段并加上斜杠,保持目录格式sort -u:对结果去重,避免重复的目录项
提取二级目录(如foo/sub/、bar/test/)
如果需要更深层级的目录,只需调整print的字段即可:
git diff --name-only | awk -F '/' '{print $1"/"$2"/"}' | sort -u
方法2:使用sed正则匹配目录
sed的正则表达式可以精准匹配指定层级的路径部分:
提取一级目录
git diff --name-only | sed -E 's/([^/]+\/).*/\1/' | sort -u
- 正则
([^/]+\/):匹配第一个斜杠前的所有字符加斜杠 \1:保留匹配到的目录部分,替换掉后面的文件名
提取N级目录
要提取N级目录,只需修改正则中的重复次数:
# 提取3级目录,比如`a/b/c/` git diff --name-only | sed -E 's/(([^/]+\/){3}).*/\1/' | sort -u
把{3}换成你需要的目录层级数字即可。
方法3:结合dirname和sed处理
dirname命令可以直接提取文件的父目录,再通过sed补全斜杠:
git diff --name-only | xargs dirname | sed 's/$/\//' | sort -u
xargs dirname:对每个文件路径提取父目录(如foo/1.txt变成foo)sed 's/$/\//':在每个目录末尾加上斜杠,统一格式
通用适配
如果你的文件列表来自其他地方(比如本地的filelist.txt),只需把git diff --name-only换成cat filelist.txt即可,命令逻辑完全通用。
内容的提问来源于stack exchange,提问作者joachim
相关产品推荐
相关产品推荐

