如何找到具有给定名称的祖先目录?

如何找到具有给定名称的祖先目录?

如何找到具有特定名称的父目录的路径?例如,假设我有一个目录/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 )##

相关内容