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

如何从指定路径中提取特定位置的目录名

如何从指定路径中提取特定位置的目录名

我明白你要抓的是users和random之间的那个目录名,给你几个实用的shell方法,都是在bash环境下直接能用的:

方法一:用bash参数展开(纯shell内置,不需要额外工具)

这个方法利用bash的字符串处理特性,精准截取我们需要的部分:

file="./home/mnt/users/upload/random/reports/on/a/server.md"
# 先移除路径开头的 "./home/mnt/users/" 部分
trimmed_prefix=${file#./home/mnt/users/}
# 再移除 "/random/" 及之后的所有内容
target_dir=${trimmed_prefix%%/random/*}
echo $target_dir  # 输出: upload

解释下:

  • ${var#pattern}:删除变量开头匹配pattern的最短部分
  • ${var%%pattern}:删除变量结尾匹配pattern的最长部分
    组合起来就刚好锁定users和random之间的目录。

方法二:用awk按分隔符提取(结构固定时最简洁)

如果你的所有路径结构都和示例一致(users之后就是目标目录,再之后是random),可以直接按/分割路径,取对应位置的字段:

echo "$file" | awk -F '/' '{print $5}'

这里按/拆分后,users是第4个字段,后面的目标目录就是第5个,直接打印就行,非常省事。

方法三:用sed正则捕获(结构灵活时更通用)

如果路径前面的部分可能有变化,但users/目标目录/random这个核心结构不变,用正则匹配更稳妥:

echo "$file" | sed -E 's|.*users/([^/]+)/random.*|\1|'

正则逻辑:

  • .*users/:匹配到users/之前的所有内容
  • ([^/]+):捕获users/之后到下一个/之间的所有字符(也就是我们要的目录名)
  • /random.*:匹配/random及之后的所有内容
    最后把整个字符串替换成捕获到的分组\1,就得到目标目录名了。

另外提一句,你之前试的方法方向有点偏:

  • echo ${file%/*}是去掉文件部分,得到的是文件所在的完整目录(./home/mnt/users/upload/random/reports/on/a)
  • basename $(dirname $(dirname $file))是取倒数第三个目录(也就是a),不是你要的位置~

备注:内容来源于stack exchange,提问作者Prany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:52:48