如何在Bash中筛选带子目錄的路径,排除无子目錄的父路径?
解决方法:筛选最底层的目录路径
核心需求是排除作为父目录的路径,只保留没有子目录(最底层)的目标路径——比如保留src/services/sam-agent/auth,排除src/services/sam-agent、src/services/wam-controller/api这类父路径。
你可以修改命令为:
find src/services/ -type f -name 'BUILD.bazel' | sed -r 's|/[^/]+$||' | sort | uniq | grep -e '*-controller' | awk '{arr[NR]=$0} END {for(i=1;i<=NR;i++) {if(i==NR || arr[i+1] !~ "^"arr[i]"/") print arr[i]}}'
命令各部分作用:
find src/services/ -type f -name 'BUILD.bazel':遍历src/services目录下所有名为BUILD.bazel的文件sed -r 's|/[^/]+$||':去掉文件名,提取每个BUILD.bazel所在的目录路径sort | uniq:对路径排序并去重,避免重复目录grep -e '*-controller':保留名称包含*-controller的路径(保留你原有的筛选规则)awk ...:核心逻辑,遍历所有路径,只保留最底层目录——如果下一个路径不是当前路径的子目录,就打印当前路径;最后一行直接打印
如果你的需求只是排除src/services下直接的一级目录(比如src/services/sam-agent),但保留其下所有子目录(包括wam-controller/api这类二级父目录),可以用更简单的版本:
find src/services/ -type f -name 'BUILD.bazel' | sed -r 's|/[^/]+$||' | sort | uniq | grep -e '*-controller' | grep -v '^src/services/[^/]*$'
这里的grep -v '^src/services/[^/]*$'会排除所有src/services/xxx格式的一级目录路径,保留更深层级的路径。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

