在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
相关产品推荐
相关产品推荐

