提取文件名和目录名的一些方法

简介:

很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

下面介绍两种常用的方法来进行相关的操作。


一、使用${}

1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。


若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}


2、${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。


如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。


3、${var#*.}
该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

4、${var%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:

从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

5、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:

当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

6、${}总结

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。


看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

#:表示从左边算起第一个

%:表示从右边算起第一个

##:表示从左边算起最后一个

%%:表示从右边算起最后一个

换句话来说,#总是表示左边算起,%总是表示右边算起。

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。


例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。


看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。


二、basename和dirname

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

1、basename

该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。


1)从路径中提出出文件名(带后缀),例子如下:




2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:


2、dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:

这样就提取出了file.txt文件所在的目录。

注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

它提取出了目录dir2所在的目录dir1.











本文转自super李导51CTO博客,原文链接: http://blog.51cto.com/superleedo/2050236  ,如需转载请自行联系原作者



相关文章
|
8天前
如何快速提取出一个文件里面全部指定类型的文件的全部路径
该文介绍了如何使用一个工具进行文件批量复制。工具可以从百度网盘(提取码:qwu2)或蓝奏云(提取码:2r1z)下载。打开工具后切换到第五模块,使用Ctrl+5快捷键进入文件批量复制功能。点击“搜索添加”,选择要搜索的文件夹(如PS文件夹),勾选搜索全部子文件,然后开始搜索。搜索完成后,会显示所有结果。
|
8天前
选择特定后缀文件/删除文件夹中文件特定后缀名字
选择特定后缀文件/删除文件夹中文件特定后缀名字
|
Linux
linux命令basename:去掉路径和扩展名,得到指定文件的文件名(去除文件扩展名.xxx)
linux命令basename:去掉路径和扩展名,得到指定文件的文件名(去除文件扩展名.xxx)
131 0
|
Python
Python获取指定目录下的所有文件路径、获取指定目录下所有文件名(但是不包含子目录中文件名)、获取指定目录下所有pdf文件名(但是不包含子目录中pdf文件名)
Python获取指定目录下的所有文件路径、获取指定目录下所有文件名(但是不包含子目录中文件名)、获取指定目录下所有pdf文件名(但是不包含子目录中pdf文件名)
197 0
C#编程:通过文件路径获取文件名
C#编程:通过文件路径获取文件名
298 0
|
存储 文件存储 C++
C++ 实现输出某个文件夹下所有文件名称,finddata_t、findfirst、findnext函数祥讲细讲解
利用C++实现输出某个文件夹下的文件名,需要用到的函数及其数据类型;
|
网络安全 数据库
find命令/文件名后缀
2.23/2.24/2.25 find命令 2.26 文件名后缀   find 搜索文件的命令: which   它是从环境变量中找: [root@centos_1 ~]# which ls alias ls='ls --color=auto' /usr/bin/ls   ...
1302 0

热门文章

最新文章