不少时候在使用Linux的shell时,咱们都须要对文件名或目录名进行处理,一般的操做是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。
shell
下面介绍两种经常使用的方法来进行相关的操做。设计
1、使用${}指针
一、${var##*/}
该命令的做用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果以下:
ip
从运行结果能够看到,使用该命令,能够提取出咱们须要的文件名file.txt。变量
若使用时在shell程序文件中,可使用变量来保存这个结果,再加以利用,如file=${var##*/}file
二、${var##*.}
该命令的做用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果以下:
程序
从运行结果能够看到,使用该命令,能够提取出咱们须要的文件后缀。方法
若是文件的后缀不只有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。im
三、${var#*.}
该命令的做用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果以下:
从运行结果能够看到,使用该命令,能够提取出文件的多个后缀。
四、${var%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果以下:
从运行的结果能够看到,使用该命令,能够提取出咱们须要的文件所在的目录
五、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果以下:
当咱们须要创建一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可使用该命令来进行操做。例如,解压文件的状况就与此相似,咱们压缩文件file.zip时,会在与file.zip同级目录下创建一个名为file的目录。
六、${}总结总结
其实${}并非专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操做,它能够提取很是多的内容,并不必定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到很是难以理解和记忆,其实否则,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来讲,#老是表示左边算起,%老是表示右边算起。
*:表示要删除的内容,对于#和##的状况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的状况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
看到这里,就能够知道,其实该命令的用途很是普遍,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。
2、basename和dirname
${}并非专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为作这一件事而已准备的了。
一、basename
该命令的做用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1)从路径中提出出文件名(带后缀),例子以下:
2)从上面命令的用法中能够看到,后缀(SUFFIX)是一个可选项。因此,若只想提取出文件名file,而不带有后缀,还能够在变量的后面加上后缀名,例子以下:
二、dirname
该命令的做用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子以下:
这样就提取出了file.txt文件所在的目录。
注:该命令不只能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,以下:
它提取出了目录dir2所在的目录dir1.