linux环境下从路径字符串中截取目录和文件名信息
文章目录
- 前言
- 使用系统命令完成路径截取
- 使用 basename 命令获取文件名
- 使用 dirname 命令获取目录名
- 利用变量提取操作完成截取
- 截取根目录
- 截取文件名
- 截取文件后缀
- 截取文件所在的目录
- 样例
- 总结
前言
之前在文章《.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好友列表,再想凑齐所有人一起开黑几乎不可能了。
打了半宿输多赢少,还是那个手残的我。出了新的英雄,添了新的装备,面对这个曾经挚爱的游戏感觉有些陌生,历史的车轮不会因为你不关注就会停止,相反,这些“平行世界”总是在向前奔跑着,唯一不变的就是变化~
linux环境下从路径字符串中截取目录和文件名信息相关推荐
- windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名
标 题: Linux 系统下无法查看Windows 中创建的中文文件名 我是Linux初学者,在网上搜索了很久,经过多次尝试仍然无法解决问题,只好在这里发贴请教了,还望各位高手指点一下. 问题描述: ...
- Linux环境下通过gstack命令查看进程的运行堆栈信息
gstack命令的说明如下: NAMEgstack - print a stack trace of a running process SYNOPSISgstack pid DESCRIPTIONg ...
- wps控件在springMVC和spring-boot搭建的项目中,客户端是Linux环境下,插件的保存方法无法请求后台的原因
一.原因: 1.wps插件的请求是跨域请求的方式,在linux环境下出于安全机制,不允许获取浏览器的session内容,所以wps插件的请求中就缺失了session信息,导致访问到后台根本没有反应. ...
- Linux环境下Risk of rain 2(雨中冒险2)服务器搭建
最近雨中冒险2出了新虚空DLC,有个朋友的轻薄本刚好能跑,于是乎就入手了一个开玩,但是他发现以他校园网那种渣渣网络根本不可能和好友愉快的联机,第一天还笑嘻嘻的拉人开房爽玩,第二天就房间都进不去了hhh ...
- Linux 使用root用户登录系统,并查看当前的路径。 查看当前目录下面的所有文件(包括隐藏文件)。 在当前目录下,查看根目录中的目录结构。
Linux一些命令 1.使用root用户登录系统,并查看当前的路径. 2.查看当前目录下面的所有文件(包括隐藏文件). 3.在当前目录下,查看根目录中的目录结构. List item 4.在当前/ro ...
- 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。
在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...
- Java练习-----2.对Windows和Linux环境下输入的文件路径格式进行校验
1.需求 Windows环境下路径格式只能为 D:\Desktop\source Linux环境下路径格式只能为 /data/source 2.结果展示 Linux环境下运行成功,懒得开虚拟机,就不展 ...
- linux环境下python编程指南,在Linux系统中搭建Python编程环境
Linux系统是为编程而设计的,因此在大多数Linux计算机中都默认安装了Python. 1. 检查Python版本 在系统中运行应用程序Terminal(如果是Ubuntu,可按Ctrl+Alt+T ...
- pyqt 服务器mysql_PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改...
最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下: #-*- coding: utf-8 -*- '''[简介] PyQt5中 处理database 例子''' importsysfrom Py ...
最新文章
- elasticsearch原理_ElasticSearch读写底层原理及性能调优
- Linux修改文件权限为777
- mysql 监控 开源_强大的开源企业级数据库监控利器Lepus
- 如何快速排查生产问题
- jQuery动画效果animate和scrollTop结合使用实例
- xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
- Altium Designer(AD)18安装
- 高负载高并发网站架构分析
- PPT的配色方法(师从于珞珈老师)
- EPLAN软件安装教程
- mysql 多条件求和_多条件求和的8种方法【Excel分享】
- OutMan——C语言中文件的操作
- PCB设计笔记-AD(一)-如何从立创EDA中将元器件导入AD中
- HTML5期末大作业:旅游网页设计与实现——四川成都-(9页 带购物车)
- ava.lang.IllegalArgumentException: At least one base package must be specified 	at org.springframewo
- 冷数据、温数据、热数据,难道数据也是有温度的?
- 一个简单的C语言程序是怎么来的呢?
- PSR开关电源设计的得与失
- 如何用 FinalCutPro剪辑HDR视频
- 关于小程序中保留小数点后几位的问题