如何找到具有特定名称的父目录的路径?例如,假设我有一个目录/a/b/c/d/e/f/g
,并且我想找到名称为 的父目录c
,我希望它返回/a/b/c
。
用例是我位于一个相当嵌套的目录结构中,并且我不想有难以阅读的字符串 of ../../..
,当我更新目录的嵌套级别时,我还需要确保更改该字符串未来的目录结构。
不是破坏性的,但如果有两个具有给定名称的祖先目录,我理想地想要具有最长路径的一个。 ie/a/b/c/d/e/c/f/g
理想情况下应该返回/a/b/c/d/e/c
而不是/a/b/c
.
答案1
解决方案是使用参数替换两次。
我们首先将目录的路径名存储在变量中(如果您正在处理当前工作目录,则可以跳过此步骤并PWD
在以后使用p
):
$ p=/a/b/c/d/e/c/f/g
*/c/
然后我们可以从中删除匹配的最长前缀字符串:
$ echo "${p##*/c/}"
f/g
然后我们意识到,如果这个结果被从结尾的$p
,我们会得到我们想要的结果:
$ echo "${p%${p##*/c/}}"
/a/b/c/d/e/c/
/
或者,也删除最后一个:
$ echo "${p%/${p##*/c/}}"
/a/b/c/d/e/c
这标准参数替换 ${variable##pattern}
分别去除${variable%pattern}
最长匹配的前缀字符串和最短匹配的后缀字符串。
(要获得/a/b/c
您不想要的 ,您可以在“内部”替换中使用#
of )##