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

在Bash中如何不使用循环裁剪目录路径字符串仅保留最后两级子目录

解法1:纯Bash参数扩展(无需外部命令、无循环,最高效)

直接用Bash内置的前缀删除语法,匹配并删除前5级目录对应的前缀即可:

# 示例路径变量
path1="/home/Leo/Work/CMI/ARCH/MWS/Disks"
path2="/home/Cleo/Work/CMI/ARCH/BK/Disks"

# 裁剪逻辑:先删末尾可能存在的斜杠,再删除前5级目录前缀,最后补上前导斜杠
trim_path() {
  local p=${1%/}
  echo "/${p#/*/*/*/*/*/}"
}

# 测试
trim_path "$path1" # 输出 /MWS/Disks
trim_path "$path2" # 输出 /BK/Disks

语法说明:${变量#匹配规则} 表示从变量内容开头删除最短匹配的字符串,连续5个/*刚好匹配前5级目录的路径段。


解法2:使用shift实现(回答对shift适用性的疑问)

shift可以用于该场景,只要先把路径按/拆分为位置参数即可:

trim_path() {
  local p=${1%/}
  # 按/拆分路径存入数组
  IFS=/ read -ra segs <<< "$p"
  # 将数组元素设为位置参数,shift移除前6个元素(开头空段+前5级目录)
  set -- "${segs[@]}"
  shift 6 2>/dev/null || true
  # 拼接剩余路径段
  echo "/$(IFS=/; echo "$*")"
}

解法3:保留最后2级(适配路径总段数不固定的场景)

如果后续路径层级变化,不需要固定删前5级,只要最后2级,可以用这个方案:

trim_path() {
  local p=${1%/}
  echo "/$(basename "$(dirname "$p")")/$(basename "$p")"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:15:04