当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 使用系统命令完成路径截取
    • 使用 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好友列表,再想凑齐所有人一起开黑几乎不可能了。
打了半宿输多赢少,还是那个手残的我。出了新的英雄,添了新的装备,面对这个曾经挚爱的游戏感觉有些陌生,历史的车轮不会因为你不关注就会停止,相反,这些“平行世界”总是在向前奔跑着,唯一不变的就是变化~

相关文章:

  • MD5是用来加密的吗?BCrypt又是什么呢
  • 树的带权路径长度和哈夫曼树
  • 完全图与强连通图的那些坑
  • linux环境下恢复rm误删的文件
  • 记一次使用Valgrind查找解决内存问题的玄幻旅程
  • 网络工具nc的常见功能和用法
  • git常用配置——git show/diff tab 显示宽度
  • Windows设置防火墙允许指定应用正常使用网络
  • 2021年终总结——脚踏实地,为下一次腾飞积蓄力量
  • 通过WindowsStore安装QuickLook小工具方便文件预览
  • linux环境下随时照看服务器进程的ps和top命令
  • 简单梳理下git的使用感受,思考git中最重要的是什么
  • 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)
  • epoll的LT模式(水平触发)和ET模式(边沿触发)
  • C++可变参数模板的展开方式
  • [译] 怎样写一个基础的编译器
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android 架构优化~MVP 架构改造
  • Android系统模拟器绘制实现概述
  • CentOS 7 防火墙操作
  • extract-text-webpack-plugin用法
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Travix是如何部署应用程序到Kubernetes上的
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端面试之闭包
  • 区块链将重新定义世界
  • 算法-图和图算法
  • 小程序开发中的那些坑
  • 走向全栈之MongoDB的使用
  • linux 淘宝开源监控工具tsar
  • Spring Batch JSON 支持
  • 阿里云服务器购买完整流程
  • ​2020 年大前端技术趋势解读
  • ​低代码平台的核心价值与优势
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #NOIP 2014# day.2 T2 寻找道路
  • (2)nginx 安装、启停
  • (30)数组元素和与数字和的绝对差
  • (function(){})()的分步解析
  • (附源码)php投票系统 毕业设计 121500
  • (转)EOS中账户、钱包和密钥的关系
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)关于pipe()的详细解析
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core中的去虚
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET框架设计—常被忽视的C#设计技巧
  • @RequestBody与@ModelAttribute
  • @RequestBody与@ResponseBody的使用