如何在Bash中获取dirname的最后一部分

时间:2014-04-18 21:03:19

标签: bash shell dirname

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

9 个答案:

答案 0 :(得分:88)

即使它不是文件,您也可以使用basename。使用dirname删除文件名,然后使用basename获取字符串的最后一个元素:

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

答案 1 :(得分:19)

使用bash字符串函数:

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

答案 2 :(得分:17)

dirname相反的是basename

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

答案 3 :(得分:4)

Pure BASH方式:

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

答案 4 :(得分:2)

另一种方式

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

答案 5 :(得分:2)

使用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)

由于没有使用外部命令,因此效率更高。

答案 6 :(得分:1)

awk这样做的方法是:

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

<强>解释

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

答案 7 :(得分:1)

这个问题类似于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

答案 8 :(得分:1)

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

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