截取文件名和后缀

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

1

2

3

4

5

6

7

$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这样的呢?呃……正则表达式肯定可以。

1

2

3

4

5

$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 命令将字符串反转一下,区分后缀和文件名的.字符位置就确定了。截取了想要的部分之后,再次反转就得到了我们想要的内容。

1

2

3

4

5

$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脚本一样可以做到所有的操作。看下面的实现:

1

2

3

4

5

6

7

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

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

$dir="${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删掉一级目录,linux命令删除文件夹

    本文收集整理关于linux命令删除文件夹的相关议题,使用内容导航快速到达. 内容导航: Q1:linux shell 删除文件夹命令 iftestx"$1"=x"-f&q ...

  3. linux系统编程笔记02——Linux命令:修改文件权限命令chmod、chgrp、chown详解

    Linux命令:修改文件权限命令chmod.chgrp.chown详解 Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限 ...

  4. linux命令---查找文件中的内容

    linux命令---查找文件中的内容 [yang@localhost ~]$ cat 1.txt |egrep '123456789|second'-------匹配123456789或者second ...

  5. Linux命令:文件和目录操作

    Linux命令:文件和目录操作 >文件是Linux用来存储信息的基本结构, 它是被命名(称为文件名)的存储在某种介质(如磁盘.光盘.磁带等)上的一组信息的集合. >Linux系统文件以文件 ...

  6. linux给文件夹加密码,如何使用linux命令给文件上锁?linux命令文件加密方法

    如何用linux命令给文件夹加密上锁呢?这是很多linux用户会碰到的问题,今天小编给大家介绍下linux命令给文件加密上锁的方法. 怎么用linux命令给自己的文件上锁 原因: 有些时候一个工程需要 ...

  7. Linux命令--查看文件信息

    原文网址:Linux命令--查看文件信息_IT利刃出鞘的博客-CSDN博客 简介 本文介绍查看文件信息的一些命令.有如下命令:ls.ll.file.stat ls 见:Linux命令--ls--使用/ ...

  8. 【Linux命令】文件和目录权限

    [Linux命令]文件和目录权限 权限查看 众所周知,可以使用 ls -l 来查看文件和目录的详细信息,那么输出的东西是什么呢? 我们先来看 文件类型: -:普通文件: d:目录文件: b:块特殊文件 ...

  9. wget命令下载文件并另存为不同的文件名

    本文翻译自:wget command to download a file and save as a different filename I am downloading a file using ...

最新文章

  1. VS2012代码提示快捷键
  2. ssh,FTP到远程服务器时,显示自定义的警告信息
  3. Virtex-6器件的时钟资源、混合模式时钟管理器(MMCM)
  4. 再过四十年,你的女朋友可能是个美丽的机器人!不信你看
  5. Linux查看时间段文件,Linux查看特定时间段内修改过的文件
  6. Active MQ 传输 ObjectMessage 异常
  7. 诺基亚n9支不支持java,支持诺基亚N9 MeeGo UC浏览器正式发布
  8. javaWeb基础知识及注意事项
  9. BAT命令手动_自动启动和禁用服务
  10. 随手记_C++常考面试题
  11. 前端----JavaScript
  12. rename 命令批量修改后缀
  13. DEV C++下载,百度云盘,干净
  14. Android APK反编译技巧全讲解
  15. 反垃圾邮件系统管理手册
  16. 春节快乐!发个大红包!
  17. 优化 | Pick and delivery problem的简介与建模实现(二)
  18. 海贼王最新漫画情报分析
  19. no module named ‘lap‘
  20. 计算机凭据分配在哪里,电脑策略没有凭据分配怎么办

热门文章

  1. 利用Python脚本实现批量格式转换(视频转音频)
  2. ProcessingJoy —— 连线的幽浮魔点(2D/3D)【JAVA】
  3. 计算机应用基础试题b卷,计算机应用基础试卷(B卷)及答案.doc
  4. Docker搭建svn服务器
  5. 剪辑视频,横屏改竖屏怎么操作
  6. uniapp使用支付宝芝麻信用免押
  7. Struts2之配置使用
  8. 这一次数据说了算,『访问者模式』
  9. html让整个div居中,分享一个可以让DIV实现居中齐的方法
  10. SQL 条件匹配(一)