截取文件名和后缀

编写Shell脚本的过程中,经常会和文件名和文件路径打交道。如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢。Shell脚本拥有强大的字符串处理能力,如果把文件名当做字符串,我们不难使用cut或sed这样的工具得到我们想要的结果。

$fullfile=/the/path/foo.txt

$fullname=$(basename $fullfile)

$dir=$(dirname $fullfile)

$filename=$(echo $fullname | cut -d . -f1)

$extension=$(echo $fullname | cut -d . -f2)

$ echo $dir , $fullname , $filename , $extension

/the/path , foo.txt , foo , txt

这里使用basename命令可以直接得到包含后缀的文件名,而dirname命令可以得到路径名,然后就能简单的用cut截取文件名和后缀名。

更复杂的情况

如果对付简单应用场景,到这里已经可以打完收工了,但是有时候文件可能不止有一个后缀,比如*.tar.gz,怎样得到最后一个后缀呢?再cut一回?当然可以,但是如果文件名是mylib.1.0.1a.zip这样的呢?呃......正则表达式肯定可以。

$ fullname=mylib.1.0.1a.zip

$ filename=$(echo $fullname | sed 's/\.[^.]*$//')

$ extension=$(echo $fullname | sed 's/^.*\.//')

$ echo $filename, $extension

mylib.1.0.1a, zip

这里面的逻辑是这样的:

文件名:把以.字符开头以后一直到行尾都是非.字符的子串替换为空。

后缀名:把从行首开始以.字符结尾的子串替换为空。

光用语言把这两个正则表达式描述出来脑细胞也要死不少。有没有像上面cut版本一样简单容易理解的方法呢?由于.分隔符的个数不确定,正常使用cut来分割最后一个.字符是不太可能的。但是我们可使用 rev 命令将字符串反转一下,区分后缀和文件名的.字符位置就确定了。截取了想要的部分之后,再次反转就得到了我们想要的内容。

$ fullname=mylib.1.0.1a.zip

$ filename=$(rev <<< $fullname | cut -d . -f2- | rev)

$ extension=$(rev <<< $fullname | cut -d . -f1 | rev)

$ echo $filename, $extension

mylib.1.0.1a, zip

使用参数扩展

其实不借助复杂的正则表达式,甚至不调用basename, dirname, cut, sed命令,shell脚本一样可以做到所有的操作。看下面的实现:

$ fullfile=/the/path/mylib.1.0.1a.zip

$ fullname="${fullfile##*/}"

$ dir="${fullfile%/*}"

$ extension="${fullname##*.}"

$ filename="${fullname%.*}"

$ echo $dir , $fullname , $filename , $extension

/the/path , mylib.1.0.1a.zip , mylib.1.0.1a , zip

真是不能再简洁了,大括号之内变量名配合几个神奇的字符,就是Shell的参数扩展(Parameter Extension)功能。

${fullfile##*/}:从前面开始删除fullfile中最大匹配(longest matching pattern) */ 的字符串

${fullfile%/*}:从后面开始删除fullfile中最小匹配(shortest matching pattern) /* 的字符串

${fullname##*.}:从前面开始删除fullname中最大匹配(longest matching pattern) *. 的字符串

${fullname%.*}:从后面开始删除fullname中最小匹配(shortest matching pattern) .* 的字符串

参数扩展有多种形式,在shell编程中可以用作参数的拼接,字符串的替换,参数列表截取,变量初值等操作,这里不再详述,请参考后面的功能列表和官方文档

参数扩展功能列表

参数形式

扩展后

x{y,z}

xy xz

${x}{y, z}

${x}y ${x}z

${x}{y, $z}

${x}y ${x}${z}

${param#pattern}

从param前面删除pattern的最小匹配

${param##pattern}

从param前面删除pattern的最大匹配

${param%pattern}

从param后面删除pattern的最小匹配

${param%%pattern}

从param后面删除pattern的最大匹配

${param/pattern/string}

从param中用string替换pattern的第一次匹配,string可为空

${param//pattern/string}

从param中用string替换pattern的所有匹配,string可为空

${param:3:2}

截取$param中索引3开始的2个字符

${param:3}

截取$param中索引3至末尾的字符

${@:3:2}

截取参数列表$@中第3个开始的2个参数

${param:-word}

若$param为空或未设置,则参数式返回word,$param不变

${param:+word}

若$param为非空,则参数式返回word,$param不变

${param:=word}

若$param为空或为设置,则参数式返回word,同时$param设置为word

${param:?message}

若$param为空或为设置,则输出错误信息message,若包含空白符,则需引号

linux 脚本文件后缀,Shell 截取文件名和后缀相关推荐

  1. linux命令 截取文件后缀名,Shell截取文件名和后缀(转载)

    截取文件名和后缀 编写Shell脚本的过程中,经常会和文件名和文件路径打交道.如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢.Shell脚 ...

  2. linux 截取后缀名,Shell 截取文件名和后缀

    截取文件名和后缀 编写Shell脚本的过程中,经常会和文件名和文件路径打交道.如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢.Shell脚 ...

  3. linux脚本文件编辑器,Shell文件编辑器

    文件编辑器,允许在文件中插入.编辑和替换文本等操作. 本文主要针对vim编辑器和nano编辑器的使用做简单记录,目前macOS是支持这两种编辑器的. vim编辑器 vi编辑器是Unix系统最初的编辑器 ...

  4. linux 脚本的作用,shell export 作用

    shell与export命令用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序.运行shell脚本程序 ...

  5. linux脚本退出状态,Shell退出状态的使用

    每一条 Shell 命令,不管是 Bash 内置命令(例如 cd.echo),还是外部的 Linux 命令(例如 ls.awk),还是自定义的 Shell 函数,当它退出(运行结束)时,都会返回一个比 ...

  6. linux脚本编程有参函数,shell脚本编程进阶:函数

    一.函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程: 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一 ...

  7. linux脚本编写规则,shell脚本编写守则

    现在centos7中使用的是bash软件,通过以下命令可以查看bash版本: [root@localhost ~]# cat /etc/redhat-release #查看系统的版本 CentOS L ...

  8. linux脚本基本命令大全,Shell脚本常用命令

    Shell脚本常用命令 1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...

  9. linux 脚本中=$4,shell脚本实例,通向shell脚本大师的必经之路

    概述 读书百遍其义自见,shell脚本也是,只要例子看得多了,自然就知道怎么写了.这里主要整理了20几个例子,因为内容比较多,所以分了几次来做介绍了.下面的实例最好先自己思考怎么去实现,然后再看下实现 ...

最新文章

  1. Theano3.3-练习之逻辑回归
  2. 如何用 Netty 设计一个百万级推送服务?
  3. jdk1.8 源码分析导图
  4. 大数据WEB阶段 (六)MySql详解(一)
  5. 【程序设计】浅析编程语言的区间为何常是左闭右开
  6. 软化边硬化边_夏天多给小朋友吃它,蛋白质是牛肉的3倍,老人吃还能软化血管...
  7. Python练习:用户登录(三次机会)
  8. 模板建网站-开源工具
  9. 转:关于Apache与Nginx的优势比较(经典)
  10. java.lang.ClassNotFoundException: org.apache.hive.service.cli.thrift.TCLIService$Iface
  11. i.MX6UL IO分析
  12. 一个人的职业生涯之旅 —— 应届生求职、面试、Offer、跳槽(发展瓶颈、薪资倒挂、职业倦怠、骑驴找马、简历优化)问题分享
  13. Excel数字小写金额转换汉字大写金额公式的简单设置
  14. android xposed开发视频,【Xposed】抖音短视频检测 Xposed 分析
  15. 区块链+医疗:隐藏的百亿级市场?
  16. 公共数据库访问连接类
  17. 如何帮助公司设计一个优秀的品牌标志?
  18. java输出0-100之间的偶数、奇数
  19. 安装opencv 3.4.1记录
  20. 电脑的远程控制是什么

热门文章

  1. Gem5模拟器 for Ubuntu20.04
  2. 谷歌浏览器驱动下载地址
  3. hadoop fs、hadoop dfs、hdfs fs、hdfs dfs区别
  4. C++ 个人财务收支管理系统
  5. 前端vue项目中$t()的意义
  6. php使用wkhtmltopdf将html转为pdf
  7. 五十音三天快速记忆方法汇总
  8. 对用户体验的一些思考
  9. 电容笔值不值得买?电容笔十大品牌排行
  10. Java编程题--井字棋