如何从指定路径中提取特定位置的目录名
如何从指定路径中提取特定位置的目录名
我明白你要抓的是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
相关产品推荐
相关产品推荐

