bash:提取路径名的最后两个目录

2024-01-10

我似乎在 bash 中失败了一些非常简单的事情。我有一个字符串变量,它保存目录的完整路径。我想分配最后一个two将其中的目录转换为另一个字符串。例如,如果我有:

DIRNAME = /a/b/c/d/e

我想要:

DIRNAME2 = d/e

我确信有一个简单的 bash 构造或者sed命令可以做到这一点,但它逃脱了我的视线。我有点喜欢通用版本basename or dirname这不仅仅返回名称的极端部分。

Thanks!


DIRNAME="/a/b/c/d/e"
D2=$(dirname "$DIRNAME")
DIRNAME2=$(basename "$D2")/$(basename "$DIRNAME")

或者,在一行中(但要小心所有双引号 - 当它分开时会更容易):

DIRNAME2=$(basename "$(dirname "$DIRNAME")")/$(basename "$DIRNAME")

除非您非常沉迷于受虐狂,否则不要尝试使用反引号的游戏。如果路径中可能有空格,请在变量名称两边使用双引号。

这几乎适用于任何 shell Korn Shell 以及 Bash。在bash,还有其他可用的机制 - 其他答案说明了许多选项中的一些,但expr也是一个老式的解决方案(它也出现在第七版 Unix 中)。这段使用反引号的代码也适用于 Bash 和 Korn shell,但不适用于 Heirloom Shell(类似于 Unix System V Release 2/3/4 shell,IIRC)。

DIRNAME2=`basename "\`dirname \\"$DIRNAME\\"\`"`/`basename "$DIRNAME"`

(两层嵌套并不算太糟糕,但非常糟糕;三层嵌套真的很棘手!)

Testing

当测试应该在路径名中的空格中保留的路径名操作时,值得使用包含双空格(而不是或同时包含单空格)的名称进行测试。例如:

DIRNAME="/a b/ c d /  ee  ff  /  gg  hh  "
echo "DIRNAME=[[$DIRNAME]]"
echo "basename1=[[$(basename "$DIRNAME")]]"
echo "basename2=[[`basename \"$DIRNAME\"`]]"
echo
D2=$(dirname "$DIRNAME")
echo "D2=[[$D2]]"
DIRNAME2=$(basename "$D2")/$(basename "$DIRNAME")
echo "DIRNAME2=[[$DIRNAME2]]"
echo
DIRNAME3=$(basename "$(dirname "$DIRNAME")")/$(basename "$DIRNAME")
echo "DIRNAME3=[[$DIRNAME3]]"
DIRNAME4=`basename "\`dirname \\"$DIRNAME\\"\`"`/`basename "$DIRNAME"`
echo "DIRNAME4=[[$DIRNAME2]]"

其输出是:

DIRNAME=[[/a b/ c d /  ee  ff  /  gg  hh  ]]
basename1=[[  gg  hh  ]]
basename2=[[  gg  hh  ]]

D2=[[/a b/ c d /  ee  ff  ]]
DIRNAME2=[[  ee  ff  /  gg  hh  ]]

DIRNAME3=[[  ee  ff  /  gg  hh  ]]
DIRNAME4=[[  ee  ff  /  gg  hh  ]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash:提取路径名的最后两个目录 的相关文章

随机推荐

  • OWL RDF/TTL 根据属性创建类的实例成员

    我正在尝试设计一个本体 该本体将根据产品组件对产品进行分类 在下面的例子中我有一堂课Ingredient有一个实例eggs 我想添加apple tart不包含的所有类别的产品eggs 所以在这种情况下apple tart将被添加到班级中Gl
  • 限制 UITextView 中的行数

    我很清楚有人问过这个问题 但我找不到有效的答案 使用先前解决方案的组合 我想出了以下代码 BOOL textView UITextView textView shouldChangeTextInRange NSRange range rep
  • Google App Engine 上的 CloudSQL PDO(unix_socket) 问题

    我正在尝试从 App Engine 连接到我的 CloudSQL 实例 我的设置方法是使用静态 IP 我可以使用它从 App Engine 外部 即在我的开发环境中 连接到它 但是 当应用程序在 GAE 中运行时 连接到数据库的唯一方法是使
  • 如何在 Matplotlib 中使用带有形状内文本的自定义标记?

    背景 在 Matplotlib 中 我们可以使用 mathtext 作为标记来渲染字符串 参考文献1 https matplotlib org 3 2 1 api markers api html Question 有什么方法可以将此文本封
  • UP3(jawbone)如何实时检索睡眠值

    我正在尝试实时检索我的睡眠数据 我无法从文档中找到如何实现它 UP平台Android SDK https github com Jawbone UPPlatform Android SDK 附 我愿意进行睡眠实验 需要在我到达时获取一个事件
  • Java EE / J2EE 与 J2SE / JDK 版本之间的关联

    我确信我会找到重复的问题或令人满意的答案 但我没有 我正在寻找的是这些问题的答案 Java EE J2EE 和 J2SE JDK 版本之间是否有官方关联 如果答案是肯定的 那么它写在哪里 如果答案是否定的 那为什么呢 是否有非官方版本表 例
  • Javascript原生排序方法代码

    知道如何查看本机 javascript 方法的实现 特别是排序 方法 我之所以寻找这个 我只是想知道所使用的算法是什么以及其复杂性是什么 我正在 javascript 中对一个巨大的 json 对象进行排序 我想知道我是否应该为此编写自己的
  • 有没有办法让 JSF 与通用 setter 和 getter 一起使用

    有没有办法让 JSF 与通用实体一起工作 如下所述 属性 java public interface MyProperty
  • 如何将我的所有函数打包在批处理文件中作为单独的文件?

    我的问题与this https stackoverflow com questions 10149194 something like a function method in batch files问题 我有几个需要从批处理文件执行的操作
  • 如何转换pandas中日期时间列的时区,然后删除时区?

    我有一个列 非索引列 其中包含日期时间 例如 前五个条目如下所示 Timestamp 2018 11 15 19 57 55 Timestamp 2018 11 15 19 59 46 Timestamp 2018 11 15 20 00
  • 如何将(声明)安全令牌传递给启用 WIF 的 WCF 服务

    我很想知道我们如何从已通过 WIF 启用的 WCF 服务身份验证的 WIF 应用程序发送安全令牌 任何帮助将不胜感激 答案并不简单 但以下步骤构成了 推荐模式 并记录在以下 MSDN 文章中 AD FS 2 0 身份委派分步指南 http
  • x86_64 调用约定和堆栈帧

    我试图理解 GCC 4 4 3 为 Ubuntu Linux 下运行的 x86 64 机器生成的可执行代码 特别是 我不明白代码如何跟踪堆栈帧 过去 在 32 位代码中 我习惯于在几乎每个函数中看到这个 序言 push ebp movl e
  • 从内部存储中删除文件

    我正在尝试删除存储在内部存储中的图像 到目前为止我已经想出了这个 File dir getFilesDir File file new File dir id jpg boolean deleted file delete 这是来自另一个问
  • 上限集合性能问题

    我正在做一些测试 看看我可以从 Mongodb 获得什么样的吞吐量 文档说上限集合是最快的选择 但我经常发现我可以更快地写入普通集合 根据具体的测试 我通常可以通过正常收集获得两倍的吞吐量 我错过了什么吗 我该如何解决这个问题 我有一个非常
  • 检索超过 7 天的特定用户的推文

    我正在尝试获取任何用户的推文 但它只返回最近 7 天的推文 我想检索比这更旧的推文 如何做 现在我正在通过以下方式获取推文 http search twitter com search atom q from 3Amihirpmehta h
  • bash:Python 导入 - 找不到 pandas 命令

    我是使用 MacBook 的 Python 初学者 我想进口pandas在我的 Python 脚本中 我输入以下命令 import pandas as pd 结果是 错误 bash 导入 找不到命令 问题 如何启用导入命令 我用了 usr
  • @Qualifier 的问题

    我正在 Java Spring 环境中工作 并且在让 Qualifier 工作时遇到问题 我们项目的其他部分正在使用 Inject 来获取一个 bean 但我需要有同一个 bean 的两个版本 看起来使用 Autowired 和 Quali
  • 如何使用 Java 解析此 XML?

  • Telnet smtp.mail - 必须首先发出 STARTTLS 命令

    在我的 Mac 终端上 我试图telnet进入我的smtp gmail com通过port 587 在 Google Apps 设置为管理 Dreamhost 域 上 我配置了中继 如下所示 Allowed senders Only add
  • bash:提取路径名的最后两个目录

    我似乎在 bash 中失败了一些非常简单的事情 我有一个字符串变量 它保存目录的完整路径 我想分配最后一个two将其中的目录转换为另一个字符串 例如 如果我有 DIRNAME a b c d e 我想要 DIRNAME2 d e 我确信有一