前言
之前在文章《.bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息》中总结了在批处理文件中,也就是Windows环境下怎样从路径字符串中截取文件名、盘符等信息,利用的是Windows的扩展变量,而这种截取路径的需求在linux脚本中也很常见,实现方法相比批处理脚本而言要简单一些,下面列举一下常见的方法。
使用系统命令完成路径截取
针对于路径的操作很基础,所以在linux环境下提供了专门的命令来完成路径字符串的截取工作,分别是 basename 和 dirname ,从名字就可以很容易知道他们的作用,具体的使用方法如下:
使用 basename 命令获取文件名
获取文件名时直接在命令后面添加待截取的路径即可,表现如下:
albert@home-pc:/mnt/d/data/shell$ basename /mnt/d/data/shell/test.txt
test.txt
在shell脚本的写法通常是这样:
mypath=/mnt/d/data/shell/test.txt
echo $(basename $mypath)
运行之后得到的带有后缀的文件名,如果想去掉后缀使用 -s 参数指定要去掉的后缀即可:
albert@home-pc:/mnt/d/data/shell$ basename -s .txt /mnt/d/data/shell/test.txt
test
-s 选项也可省略,将后缀名直接放到完整路径后面也可以:
albert@home-pc:/mnt/d/data/shell$ basename /mnt/d/data/shell/test.txt .txt
test
其实 -s 参数后面不一定非得加后缀名,它就是在结果的末尾去掉匹配的字符串,所以可以指定任何结尾字符:
albert@home-pc:/mnt/d/data/shell$ basename /mnt/d/data/shell/test.txt xt
test.t
使用 dirname 命令获取目录名
顾名思义 dirname 就是获取目录名的命令,直接在命令后面跟上待截取的路径即可:
albert@home-pc:/mnt/d/data/shell$ dirname /mnt/d/data/shell/test.txt
/mnt/d/data/shell
这个命令不仅可以获取文件所在目录,还可以获取目录的上一级目录,实际上它处理的仅仅是字符串,截取的目标字符也是 / ,并不要求目录是有效的
albert@home-pc:/mnt/d/data/shell$ dirname /mnt/d/data/
/mnt/d
利用变量提取操作完成截取
通过对 ${var} 表达式进行变形可以完成对原变量的部分提取和替换,下面先列举一些主要的截取操作:
表达式 | 含义 | 示例 | 结果 |
---|
${var} | var 字符串原始值 | ${var} | ^Can you can a can as a canner can can a can$ | ${#var} | var 字符串的长度 | ${#var} | ^43$ | ${var:pos} | 在字符串var 中从位置pos提取子串 | ${var:30} | ^can can a can$ | ${var:pos:len} | 在var 中从位置pos提取长度为len的子串 | ${var:30:5} | ^can c$ | ${var#substr} | 在var 左侧删除最短匹配$substr的子串 | ${var#*can a} | ^ can as a canner can can a can$ | ${var##substr} | 在var 左侧删除最长匹配$substr的子串 | ${var##*can a} | ^ can$ | ${var%substr} | 在var 右侧删除最短匹配$substr的子串 | ${var%can a*} | ^Can you can a can as a canner can $ | ${var%%substr} | 在var 右侧删除最长匹配$substr的子串 | ${var%%can a*} | ^Can you $ |
好了,知道了这些规则我们就可以利用这些截取规则,来完成截取目录的需求了,下面假设 var 的值为 ./d/data/shell/test.txt 开始具体操作。
截取根目录
要想截取根目录就是要把第一个 / 后面的内容删除就可以了,使用 ${var%%/*} 在var 右侧删除最长匹配/* 的子串,结果就只剩下 . 了:
albert@home-pc:/mnt/d/data/shell$ var="./d/data/shell/test.txt"
albert@home-pc:/mnt/d/data/shell$ echo ${var%%/*}
.
截取文件名
截取文件名需要把最后一个 / 前面的内容删除,使用 ${var##*/} 在var 左侧删除最长匹配 */ 的子串,结果为包含后缀的文件名:
albert@home-pc:/mnt/d/data/shell$ var="./d/data/shell/test.txt"
albert@home-pc:/mnt/d/data/shell$ echo ${var##*/}
test.txt
截取文件后缀
截取文件名后缀与截取文件名类似,需要包最后一个 . 前面的内容删除,使用 ${var##*.} 在var 左侧删除最长匹配 *. 的子串,只保留后缀内容:
albert@home-pc:/mnt/d/data/shell$ var="./d/data/shell/test.txt"
albert@home-pc:/mnt/d/data/shell$ echo ${var##*.}
txt
截取文件所在的目录
截取文件坐在目录就是只删除文件名,把文件名前面的 / 包括之前的内容进行保留,使用 ${var%/*} 在var 右侧删除最短匹配 /* 的子串:
albert@home-pc:/mnt/d/data/shell$ var="./d/data/shell/test.txt"
albert@home-pc:/mnt/d/data/shell$ echo ${var%/*}
./d/data/shell
样例
假设 var 的值为 ./d/data/shell/test.txt ,具体实现的表格总结如下:
需求 | 表达式 | 结果 |
---|
根目录 | ${var%%/*} | . | 文件名 | ${var##*/} | test.txt | 文件后缀 | ${var##*.} | txt | 文件所在目录 | ${var%/*} | ./d/data/shell |
总结
basename 和 dirname 是linux环境下专门截取文件名和目录名的命令工具- 处理文件路径截取的通常使用
${var} 形式的变量提取方法,这种方法很方便,但不仅限于相关目录的处理 - 常用截取表达式:文件名
${var##*/} 、文件后缀 ${var##*.} 、文件所在目录 ${var%/*}
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==
今年的1024和去年一样又是周末,凌晨登陆冰封了4、5年的对战平台账号,看着全部灰色的dota好友列表,再想凑齐所有人一起开黑几乎不可能了。 打了半宿输多赢少,还是那个手残的我。出了新的英雄,添了新的装备,面对这个曾经挚爱的游戏感觉有些陌生,历史的车轮不会因为你不关注就会停止,相反,这些“平行世界”总是在向前奔跑着,唯一不变的就是变化~
|