shell提取文件名和目录名的方法精讲

时间 : 19-04-22 栏目 : Shell进阶 作者 : 老薛 评论 : 0 点击 : 185 次

一 说明
 Linux下使用shell时,对文件名、目录名、后缀名的处理如家常便饭,通常的做法是通过路径提取。例如:从路径/tmp/zabbix/zabbix_agentd.log中提取文件名zabbix_agentd.log、提取目录/tmp/zabbix、提取文件后缀log等,下面推荐两种常用的方法。


1.1 第一种方法${}
a) ${str##*/}
该命令的作用是去掉变量str从左边算起的最后一个'/'字符及其左边的内容,返回从左
算起的最后一个'/'(不含该字符)的右边的内容,实例如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo ${str##*/}
zabbix_agentd.log
从运行结果可以看到,使用该命令,可以提取出我们需要的zabbix_agentd.log文件名。
shell程序中,可以将结果赋值给变量,如FILE_NAME=${str##*/}
b) ${str##*.}
该命令的作用是去掉变量str从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo ${str##*.}
log
如果文件有多个后缀名,如,zabbix_agentd.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${str#*.}命令了。
c) ${str#*.}
该命令的作用是去掉变量str从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
[root@bj-server-001 tmp]# ls -l /tmp/test/
总用量 4024
-rw-r--r-- 1 root root 3817177 4月  22 08:33 zabbix_agentd.log
-rw-r--r-- 1 root root  301189 4月  22 08:56 zabbix_agentd.tar.gz
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.tar.gz 
[root@bj-server-001 tmp]# echo ${str#*.}
tar.gz
d) ${str%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo ${str%/*}
/tmp/test
e) ${str%%.*}
该命令的使用是去掉变量str从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo ${str%%.*}                 
/tmp/test/zabbix_agentd
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们解压文件zabbix_agentd.zip时,会在与zabbix_agentd.zip同级目录下建立一个名为zabbix_agend的目录。
f) ${}总结
其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。
例如:${str%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

1.2 第二种方法basename和dirname
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
1.2.1 basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1) 从路径中提出出文件名(带后缀),例子如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo $(basename $str)
zabbix_agentd.log
#或者,下面的单引号是键盘上数字1左边的那个键。
[root@bj-server-001 tmp]# echo `basename $str`  
zabbix_agentd.log
2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名zabbix_agentd,而不带有后缀,还可以在变量的后面加上后缀名,如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# echo $(basename $str .log)
zabbix_agentd


1.2.2 dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
[root@bj-server-001 tmp]# str=/tmp/test/zabbix_agentd.log 
[root@bj-server-001 tmp]# dirname $str
/tmp/test
这样就提取出了zabbix_agend.log文件所在的目录。


注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,如目录所在的目录:
[root@bj-server-001 tmp]# str=/tmp/test/
[root@bj-server-001 tmp]# dirname $str  
/tmp
它提取出了目录test所在的目录tmp.

本文标签

除非注明,文章均为( 老薛 )原创,转载请保留链接: http://www.bdkyr.com/shell/2771.html

shell提取文件名和目录名的方法精讲:等您坐沙发呢!

发表评论

7 + 1 = ?


博主微信号,很高兴为您提供帮助

随便看看

为您推荐

0