【问题标题】:How to get the last part of dirname in Bash如何在 Bash 中获取 dirname 的最后一部分
【发布时间】:2014-06-03 10:42:13
【问题描述】:

假设我有一个文件/from/here/to/there.txt,并且只想获取其目录名的最后一部分to 而不是/from/here/to,我该怎么办?

【问题讨论】:

    标签: bash shell dirname


    【解决方案1】:

    您可以使用basename,即使它不是文件。用dirname去掉文件名,然后用basename得到字符串的最后一个元素:

    dir="/from/here/to/there.txt"
    dir="$(dirname $dir)"   # Returns "/from/here/to"
    dir="$(basename $dir)"  # Returns just "to"
    

    【讨论】:

    • 命令 '$dir="$(dirname $dir)"' 对我不起作用,但 'dir="$(dirname $dir)"' 工作正常。
    • 我在设置时不应该在dir 前面放美元。
    【解决方案2】:

    dirname 的反义词是basename

    basename "$(dirname "/from/here/to/there.txt")"
    

    【讨论】:

      【解决方案3】:

      使用bash字符串函数:

      $ s="/from/here/to/there.txt"
      $ s="${s%/*}" && echo "${s##*/}"
      to
      

      【讨论】:

        【解决方案4】:

        使用 Bash parameter expansion,您可以这样做:

        path="/from/here/to/there.txt"
        dir="${path%/*}"       # sets dir      to '/from/here/to' (equivalent of dirname)
        last_dir="${dir##*/}"  # sets last_dir to 'to' (equivalent of basename)
        

        因为没有使用外部命令,所以效率更高。

        【讨论】:

        • 我刚刚测试了这个。在 FreeBSD 上,这是我的结果: 代码:#!/bin/sh cd /var/svn/repos path="$1" echo "${path}" dir="${path%/*}" echo "${dir }" 实际="${dir##*/}" echo "${actual}" ----------------------------- ----------- 结果: $ ./makerepo.sh /var/test /var/test /var var $ ------------------- - - - - - - - - - 失败!对不起。似乎是一个好方法,但不是正确的答案。
        【解决方案5】:

        纯 BASH 方式:

        s="/from/here/to/there.txt"
        [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
        to
        

        【讨论】:

        • 如果文件没有点 . 将不起作用。如果目录有点. 将不起作用。保持简单并使用斜杠/ 作为分隔符。
        【解决方案6】:

        awk 的做法是:

        awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
        

        说明:

        • -F'/' 将字段分隔符设置为“/”
        • 打印倒数第二个字段$(NF-1)
        • &lt;&lt;&lt; 使用它之后的任何内容作为标准输入 (wiki explanation)

        【讨论】:

          【解决方案7】:

          另一种方法

          IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
          

          【讨论】:

          • 使用更简单:printf "%s\n" "${x[-2]}".
          【解决方案8】:

          这个问题类似于THIS

          为了解决你可以做的:

          DirPath="/from/here/to/there.txt"
          DirPath="$(dirname $DirPath)"
          DirPath="$(basename $DirPath)"
          
          echo "$DirPath"
          

          正如我朋友所说,这也是可能的:

          basename `dirname "/from/here/to/there.txt"`
          

          为了获得路径的任何部分,您可以这样做:

          echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
          OR
          echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
          OR
          etc
          

          【讨论】:

            【解决方案9】:

            对于所提出的问题,最佳答案是绝对正确的。在更一般的情况下,所需目录位于长路径的中间,这种方法会导致代码难以阅读。例如:

            dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
            dir="$(dirname $dir)"
            dir="$(dirname $dir)"
            dir="$(dirname $dir)"
            dir="$(dirname $dir)"
            dir="$(dirname $dir)"
            dir="$(basename $dir)"
            

            在这种情况下可以使用:

            IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
            THIS
            

            【讨论】:

              猜你喜欢
              • 2012-09-07
              • 1970-01-01
              • 2011-09-04
              • 2011-04-24
              • 1970-01-01
              • 2017-12-29
              • 1970-01-01
              相关资源
              最近更新 更多