Linux shell 提取文件路径中的文件名和目录名方法
很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。
1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个’/’字符及其左边的内容,返回从左边算起的最后一个’/’(不含该字符)的右边的内容。使用例子及结果如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo ${var##*/}file.txt
2、${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个’.’字符及其左边的内容,返回从左边算起的最后一个’.’(不含该字符)的右边的内容。使用例子及结果如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo ${var##*.}txt
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
3、${var#*.}
该命令的作用是去掉变量var从左边算起的第一个’.’字符及其左边的内容,返回从左边算起第一个’.’(不含该字符)的右边部分的内容。使用例子及结果如下:
[root@localhost]# var=/dir1/dir2/file.tar.gz [root@localhost]# echo ${var#*.}tar.gz
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。
4、${var%/*}
该命令的使用是去掉变量var从右边算起的第一个’/’字符及其右边的内容,返回从右边算起的第一个’/’(不含该字符)的左边的内容。使用例子及结果如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo ${var%/*}/dir1/dir2
从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录
5、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个’.’字符及其右边的内容,返回从右边算起的最后一个’.’(不含该字符)的左边的内容。使用例子及结果如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo ${var%%.*}/dir1/dir2/file
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。
6、${}总结
其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的’/’或’.’。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
1、basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo $(basename $var)file.txt
2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# echo $(basename $var .txt)file
2、dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME,与${var%/*}方法类似
使用例子如下:
[root@localhost]# var=/dir1/dir2/file.txt [root@localhost]# dirname $var/dir1/dir2
这样就提取出了file.txt文件所在的目录。
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
[root@localhost]# var=/dir1/dir2/ [root@localhost]# dirname $var/dir1
它提取出了目录dir2所在的目录dir1.
三、判断目录是否存在
#!/bin/bash testuser=zhangpan if grep $testuser /usr then echo "ok" ls -a /usr/$testuser/ elif ls -d /usr/$testuser/ then echo "主目录存在" else echo "$testuser not exist" fi
#!/bin/bash mydir=/usr/vagrant #-d检查目录是否存在 if [ -d $mydir ] then echo "$mydir exist" ls $mydir else echo "$mydir not exist" fi
-d filename:如果filename为目录,则为真 -e filename:如果filename存在,则为真 -f filename:如果filename为常规文件,则为真 -r filename:如果filename可读,则为真 -w filename:如果filename可写,则为真 -x filename:如果filename可执行,则为真
Jocsonme
Related Posts
分类目录
- Apache (6)
- APP-Android (1)
- APP-IOS (3)
- BI (2)
- Qlikview (2)
- BigData (2)
- Domain-Space (1)
- Git (4)
- Google (1)
- History – Articles (2)
- HTML+CSS (13)
- IDE-CodeEditor (1)
- NetBeans (1)
- Javascript (18)
- Linux (24)
- Load-Balancing (3)
- Memcached (1)
- MySQL (9)
- PHP (28)
- Laravel (1)
- Swoole (1)
- Symfony2.x – 3.x (2)
- ThinkPHP5 (1)
- Thirdpart – develop (6)
- ZendFramework2.x (1)
- Products-Design (1)
- Redis (1)
- SEM (2)
- SEO (2)
- Server-Architecture (5)
- Vagrant (1)
- Windows (7)
- BAT (1)
- Workplace (1)
一 | 二 | 三 | 四 | 五 | 六 | 日 |
---|---|---|---|---|---|---|
« 11月 | ||||||
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 |