Linux常用命令-basename

命令

basename

描述

strip directory and suffix from filenames
获取路径中的文件名

用法

1
2
basename NAME [SUFFIX]
basename OPTION... NAME...

选项

1
2
3
4
Options:
-a 指定多个路径
-s SUFFIX 指定后缀过滤,即不显示后缀
-z 不换行输出

注意

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
$ basename /path/to/data
data
$ basename /usr/bin/vim
vim
# 将后缀放到最后可以省略-s选项
$ basename /data/backup/dbback.tar.gz .tar.gz
dbback
# 注意后缀以点.开始,否则输出的结果就会多一个点
$ basename -s tar.gz /data/backup/dbback.tar.gz
dbback.
$ basename -s .tar.gz /data/backup/dbback.tar.gz
dbback
$ basename -a /dir1/file1 /dir2/file2
file1
file2
# 取多个路径的文件名,并且不显示后缀
$ basename -as .txt /dir1/file1.txt /dir2/file2.txt
file1
file2

使用linux命令提取文件名或目录名
# 取目录部分
$ dirname /user/work/project/backup.tar.gz
/user/work/project
# 取文件名部分
$ basename /user/work/project/backup.tar.gz
backup.tar.gz
# 取文件名部分,并且去掉指定的扩展名,注意扩展名需要以.开头
$ basename /user/work/project/backup.tar.gz .tar.gz
backup
$ basename /user/work/project/backup.tar.gz .gz
backup.tar


使用变量${}提取文件名或目录名
原理是变量的提取和替换操作,它可以提取非常多的内容,并不一定是路径中的'/''.'
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容,返回右边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容,返回左边的内容。

取目录名:${var%/*}
(类似 dirname "$var"
取文件名:${var##*/}
(类似 basename "$var"
取最短扩展名:${var##*.}
取最长扩展名:${var#*.}
取最短基本名称:${var%%.*} 或者 basename ${var%%.*}
取最长基本名称:${var%.*} 或者 basename ${var%.*}

$ var=/user/work/project/backup.tar.gz
# 右起,找到第一个'/'字符,返回从开始到该字符的内容(不含'/'),即取目录名
$ echo ${var%/*}
/user/work/project
$ dirname "$var"
/user/work/project
# 左起,找到最后一个'/'字符,返回其后面的内容(不含'/'),即取文件名
$ echo ${var##*/}
backup.tar.gz
$ basename "$var"
backup.tar.gz

# 左起,找到第一个'.'字符,返回其后面的内容(不含'.'),即取完整后缀
$ echo ${var#*.}
tar.gz
# 左起,找到最后一个'.'字符,返回其后面的内容(不含'.'),即取最后一个后缀
$ echo ${var##*.}
gz

# 右起,找到最后一个'.'字符,返回从开始到该字符的内容(不含'.')
$ echo ${var%%.*}
/user/work/project/backup
# 配合basename命令可以取文件名,且不包括后缀
$ basename ${var%%.*}
backup
# 右起,找到第一个'.'字符,返回从开始到该字符的内容(不含'.')
$ echo ${var%.*}
/user/work/project/backup.tar
# 配合basename命令可以取文件名,且不包括最后一个后缀
$ basename ${var%.*}
backup.tar