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

如何在Bash中提取路径最后两个斜杠间的字符串?

提取Bash路径中倒数第二个目录的多种方法

你提到的${${path%/*}##*/}无效是因为Bash不支持嵌套的参数扩展——没法在一个${}里直接嵌套另一个参数替换,必须拆分步骤。除了你已经找到的临时变量方法,这里还有几个实用的替代方案:

方法1:结合dirname和basename(最直观)

这两个是Bash处理路径的原生命令,组合起来逻辑清晰,还能自动处理带空格的路径:

path="/dir0/dir1/dir2/filename.ext"
cut=$(basename "$(dirname "$path")")
echo "$cut"  # 输出 dir2
  • dirname "$path" 会返回 /dir0/dir1/dir2(去掉最后一层的文件名/空)
  • 再用basename提取这个结果的最后一层目录,就是我们要的dir2

方法2:数组分割法(灵活处理特殊路径)

把路径按/拆成数组,从后往前找第一个非空元素,它的前一个就是目标目录——能兼容路径结尾带/的情况(比如/dir0/dir1/dir2/):

path="/dir0/dir1/dir2/filename.ext"
IFS='/' read -ra parts <<< "$path"

# 从数组末尾往前遍历,找第一个非空元素
for ((i=${#parts[@]}-1; i>=0; i--)); do
    if [[ -n ${parts[i]} ]]; then
        cut=${parts[i-1]}
        break
    fi
done

echo "$cut"  # 输出 dir2

方法3:正则表达式匹配(精准捕获)

利用Bash的=~正则匹配功能,直接捕获倒数第二个目录:

path="/dir0/dir1/dir2/filename.ext"

# 正则适配两种情况:带文件名、结尾带/
if [[ $path =~ ^.*/([^/]+)/[^/]*$ ]]; then
    cut=${BASH_REMATCH[1]}
    echo "$cut"  # 输出 dir2
fi

正则逻辑:匹配任意前缀,然后捕获一组不包含/的字符(目标目录),最后匹配任意非/的结尾(文件名或空)。

方法4:用rev反转字符串处理(简洁一行)

通过反转字符串把“倒数第二个目录”变成“第二个字段”,处理完再反转回来:

path="/dir0/dir1/dir2/filename.ext"
cut=$(echo "$path" | rev | cut -d'/' -f2 | rev)
echo "$cut"  # 输出 dir2

注意:如果路径结尾带/,可以先去掉结尾的/再处理,比如:

path="/dir0/dir1/dir2/"
cut=$(echo "${path%/}" | rev | cut -d'/' -f2 | rev)
echo "$cut"  # 依然输出 dir2

方法5:Awk一行处理(兼容所有路径场景)

用Awk按/分割后,从后往前找第一个非空字段,输出它的前一个字段:

path="/dir0/dir1/dir2/filename.ext"
cut=$(echo "$path" | awk -F'/' '{for(i=NF;i>0;i--) if($i!="") {print $(i-1); exit}}')
echo "$cut"  # 输出 dir2

这个方法不用额外处理结尾的/,Awk会自动跳过空字段。

内容的提问来源于stack exchange,提问作者Nisba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:42