Shell 截取文件名和后缀(转) 您所在的位置:网站首页 split切割文件后缀名 Shell 截取文件名和后缀(转)

Shell 截取文件名和后缀(转)

2023-11-11 21:41| 来源: 网络整理| 查看: 265

截取文件名和后缀

编写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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有