96

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

4

9 回答 9

143

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

dir="/from/here/to/there.txt"
dir="$(dirname $dir)"   # Returns "/from/here/to"
dir="$(basename $dir)"  # Returns just "to"
于 2014-04-18T21:20:21.967 回答
27

的反面dirnamebasename

basename "$(dirname "/from/here/to/there.txt")"
于 2014-04-18T21:07:11.937 回答
23

使用bash字符串函数:

$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
于 2014-04-18T21:23:18.257 回答
10

使用 Bash参数扩展,您可以这样做:

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)

这更有效,因为没有使用外部命令。

于 2017-06-04T03:34:51.640 回答
4

纯 BASH 方式:

s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
于 2014-04-18T21:16:17.370 回答
3

一种awk方法是:

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

解释:

  • -F'/'将字段分隔符设置为“/”
  • 打印倒数第二个字段$(NF-1)
  • <<<使用它之后的任何内容作为标准输入(维基解释
于 2014-04-19T01:19:15.780 回答
2

另一种方式

IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
于 2014-04-18T22:17:10.937 回答
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
于 2014-04-19T04:14:39.697 回答
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
于 2020-05-13T04:42:25.610 回答