如何在Bash中获取目录名的最后一部分


80

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

Answers:


117

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

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

2
命令'$ dir =“ $(dirname $ dir)”'对我不起作用,但是'dir =“ $(dirname $ dir)”'可以正常工作。
Nikolai Saiko

2
dir设置美元时,我不应该在美元前面。
David W.

26

相反的dirnamebasename

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

23

使用bash字符串函数:

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

9

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

由于不使用任何外部命令,因此效率更高。


我刚刚测试过。在FreeBSD上,这是我的结果:代码:#!/ bin / sh cd / var / svn / repos path =“ $ 1” echo“ $ {path}” dir =“ $ {path%/ *}” echo“ $ {dir }“ actual =” $ {dir ## * /}“回显” $ {actual}“ ----------------------------- -----------结果:$ ./makerepo.sh / var / test / var / test / var var $ ------------------- -----------------失败!抱歉。看来是个好方法,但不是正确的答案。
理查德·罗伯逊

4

纯BASH方式:

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

2
如果文件没有点,则不起作用.。如果目录中包含dot,则将不起作用.。保持简单,并使用斜杠/作为分隔符。
alvits 2014年

1
非常感谢@Akshay
anubhava '17

3

一种awk方法是:

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

说明:

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


1

这个问题有点像

为了解决您可以做的事情:

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.