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

如何在Bash中获取dirname的最后一部分,bash,shell,dirname,Bash,Shell,Dirname,假设我有一个文件/from/here/to/there.txt,并且只想得到它的dirnameto的最后一部分,而不是/from/here/to,我该怎么办?dirname的反面是basename: basename "$(dirname "/from/here/to/there.txt")" 纯BASH方式: s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}

假设我有一个文件
/from/here/to/there.txt
,并且只想得到它的dirname
to
的最后一部分,而不是
/from/here/to
,我该怎么办?

dirname
的反面是
basename

basename "$(dirname "/from/here/to/there.txt")"
纯BASH方式:

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

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

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

使用
bash
字符串函数:

$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
还有一条路

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

IFS=/read-rax一种
awk
方法是:

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

awk-F'/'{print$(NF-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
使用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)

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

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

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

如果文件中没有点
,则将不起作用。如果目录中有点
,则将不起作用。保持简单并使用斜杠作为分隔符。使用更简单:
printf“%s\n”“${x[-2]}”
。命令“$dir=“$(dirname$dir)””对我不起作用,但“dir=“$(dirname$dir)””效果很好。我设置它时不应该把美元放在
dir
前面。我刚刚测试了这个。在FreeBSD上,以下是我的结果:代码:#/bin/sh cd/var/svn/repos path=“$1”echo“${path}”dir=“${path%/*}”echo“${dir}”actual=“${dir###*/}”echo“${actual}”---------------------------------------结果:$./makerepo.sh/var/test/var/test var$-----------------------------失败!很抱歉这似乎是个好方法,但不是正确答案。