假设我有一个文件/from/here/to/there.txt
,并希望只获取其名称to
的最后一部分而不是/from/here/to
,我该怎么办?
答案 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