假设我有一个文件/from/here/to/there.txt
,并且只想获取其目录名的最后一部分to
而不是/from/here/to
,我该怎么办?
问问题
105706 次
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
的反面dirname
是basename
:
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 回答