文章目录

  • 前言
  • 使用系统命令完成路径截取
    • 使用 basename 命令获取文件名
    • 使用 dirname 命令获取目录名
  • 利用变量提取操作完成截取
    • 截取根目录
    • 截取文件名
    • 截取文件后缀
    • 截取文件所在的目录
    • 样例
  • 总结

前言

之前在文章《.bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息》中总结了在批处理文件中,也就是Windows环境下怎样从路径字符串中截取文件名、盘符等信息,利用的是Windows的扩展变量,而这种截取路径的需求在linux脚本中也很常见,实现方法相比批处理脚本而言要简单一些,下面列举一下常见的方法。

使用系统命令完成路径截取

针对于路径的操作很基础,所以在linux环境下提供了专门的命令来完成路径字符串的截取工作,分别是 basenamedirname,从名字就可以很容易知道他们的作用,具体的使用方法如下:

使用 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

总结

  • basenamedirname 是linux环境下专门截取文件名和目录名的命令工具
  • 处理文件路径截取的通常使用 ${var} 形式的变量提取方法,这种方法很方便,但不仅限于相关目录的处理
  • 常用截取表达式:文件名 ${var##*/}、文件后缀 ${var##*.}、文件所在目录 ${var%/*}

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==


今年的1024和去年一样又是周末,凌晨登陆冰封了4、5年的对战平台账号,看着全部灰色的dota好友列表,再想凑齐所有人一起开黑几乎不可能了。
打了半宿输多赢少,还是那个手残的我。出了新的英雄,添了新的装备,面对这个曾经挚爱的游戏感觉有些陌生,历史的车轮不会因为你不关注就会停止,相反,这些“平行世界”总是在向前奔跑着,唯一不变的就是变化~

linux环境下从路径字符串中截取目录和文件名信息相关推荐

  1. windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名

    标  题: Linux 系统下无法查看Windows 中创建的中文文件名 我是Linux初学者,在网上搜索了很久,经过多次尝试仍然无法解决问题,只好在这里发贴请教了,还望各位高手指点一下. 问题描述: ...

  2. Linux环境下通过gstack命令查看进程的运行堆栈信息

    gstack命令的说明如下: NAMEgstack - print a stack trace of a running process SYNOPSISgstack pid DESCRIPTIONg ...

  3. wps控件在springMVC和spring-boot搭建的项目中,客户端是Linux环境下,插件的保存方法无法请求后台的原因

    一.原因: 1.wps插件的请求是跨域请求的方式,在linux环境下出于安全机制,不允许获取浏览器的session内容,所以wps插件的请求中就缺失了session信息,导致访问到后台根本没有反应. ...

  4. Linux环境下Risk of rain 2(雨中冒险2)服务器搭建

    最近雨中冒险2出了新虚空DLC,有个朋友的轻薄本刚好能跑,于是乎就入手了一个开玩,但是他发现以他校园网那种渣渣网络根本不可能和好友愉快的联机,第一天还笑嘻嘻的拉人开房爽玩,第二天就房间都进不去了hhh ...

  5. Linux 使用root用户登录系统,并查看当前的路径。 查看当前目录下面的所有文件(包括隐藏文件)。 在当前目录下,查看根目录中的目录结构。

    Linux一些命令 1.使用root用户登录系统,并查看当前的路径. 2.查看当前目录下面的所有文件(包括隐藏文件). 3.在当前目录下,查看根目录中的目录结构. List item 4.在当前/ro ...

  6. 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。

    在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...

  7. Java练习-----2.对Windows和Linux环境下输入的文件路径格式进行校验

    1.需求 Windows环境下路径格式只能为 D:\Desktop\source Linux环境下路径格式只能为 /data/source 2.结果展示 Linux环境下运行成功,懒得开虚拟机,就不展 ...

  8. linux环境下python编程指南,在Linux系统中搭建Python编程环境

    Linux系统是为编程而设计的,因此在大多数Linux计算机中都默认安装了Python. 1. 检查Python版本 在系统中运行应用程序Terminal(如果是Ubuntu,可按Ctrl+Alt+T ...

  9. pyqt 服务器mysql_PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改...

    最近在跑下面这么一个代码,怎么跑都无法连通服务器,如下: #-*- coding: utf-8 -*- '''[简介] PyQt5中 处理database 例子''' importsysfrom Py ...

最新文章

  1. elasticsearch原理_ElasticSearch读写底层原理及性能调优
  2. Linux修改文件权限为777
  3. mysql 监控 开源_强大的开源企业级数据库监控利器Lepus
  4. 如何快速排查生产问题
  5. jQuery动画效果animate和scrollTop结合使用实例
  6. xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
  7. Altium Designer(AD)18安装
  8. 高负载高并发网站架构分析
  9. PPT的配色方法(师从于珞珈老师)
  10. EPLAN软件安装教程
  11. mysql 多条件求和_多条件求和的8种方法【Excel分享】
  12. OutMan——C语言中文件的操作
  13. PCB设计笔记-AD(一)-如何从立创EDA中将元器件导入AD中
  14. HTML5期末大作业:旅游网页设计与实现——四川成都-(9页 带购物车)
  15. ava.lang.IllegalArgumentException: At least one base package must be specified at org.springframewo
  16. 冷数据、温数据、热数据,难道数据也是有温度的?
  17. 一个简单的C语言程序是怎么来的呢?
  18. PSR开关电源设计的得与失
  19. 如何用 FinalCutPro剪辑HDR视频
  20. 关于小程序中保留小数点后几位的问题

热门文章

  1. 根轨迹分析 matlab,MATLAB的根轨迹分析
  2. delphi获取外网IP
  3. debian .iso文件下载地址
  4. android 相机编程,Android相机开发系列
  5. uva1594 水题
  6. 为什么不想做产品经理
  7. jenkins配置qq邮箱
  8. python设置文件权限_python通用权限框架
  9. 【猪八戒】- 2017年在线笔试“叠字问题”
  10. Tomcat学习之路