需要获取文件名和文件所在的目录(文件夹)。我所知的只有basename, dirname命令。

在网上搜索的时候,结果意外发现了${var##*/} 这样的方式。

以下内容转自:

Shell提取文件路径中的文件名、后缀、目录 - 米扑博客 (mimvp.com)

如下:

一、使用${}

${} 简介

#:表示从左边算起第一个

%:表示从右边算起第一个

##:表示从左边算起最后一个

%%:表示从右边算起最后一个

记住:#总是表示左边算起,%总是表示右边算起

bash提供的变量操作方法很多,不过这四个对于字符串截取基本够用了。

有一个方便记忆的方法,看键盘(数字符号键盘一行),"#"在"%"的左边,当使用#的时候,就说明截掉左边的内容,反之%就是从右边开始截掉,而两个 ##和%%就是最大化的截掉。

1、${var##*/}

该命令的作用是去掉变量var(var是变量名,下同)从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。

使用例子及结果如下:

1

2

3

4

5

$ var='/Users/homer/file_test.txt'

$ echo $var

/Users/homer/file_test.txt

$ echo ${var##*/}

file_test.txt

代码说明:

1)自定义变量 var='/Users/homer/file_test.txt'

2)查看变量 var :echo $var

3)${var##*/}  从左匹配到最后一个 '/' 字符及其左边的全部内容 /Users/homer/,并删除;最后返回的便是最后一个'/'(不含该字符)的右边的内容 file_test.txt

说明:

* 是模糊匹配任意字符,

##* 是从最左侧匹配任意字符,

##*/ 是从最左侧的 '/' 匹配任意字符,

{var##*/} 是从变量var中的最左侧的 '/' 匹配任意字符,并删除,

${var##*/}  保留删除匹配后的剩余右侧内容

2、${var##*.}

该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。

使用例子及结果如下:

1

2

3

$ var='/Users/homer/file_test.txt'

$ echo ${var##*.}

txt

3、${var#*.}

该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。

使用例子及结果如下:

1

2

3

4

5

$ var2='/Users/homer/file_test.tar.gz'

$ echo $var2

/Users/homer/file_test.tar.gz

$ echo ${var2#*.}

tar.gz

4、${var##*.}

该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起最后一个'.'(不含该字符)的右边部分的内容。

使用例子及结果如下:

1

2

3

$ var2='/Users/homer/file_test.tar.gz'

$ echo ${var2##*.}                   

gz

5、${var%/*}

该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。

使用例子及结果如下:

1

2

3

$ var='/Users/homer/file_test.txt'

$ echo ${var%/*}                 

/Users/homer

6、${var%%.*} (常用,修改替换后缀)

该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。

使用例子及结果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

$ var='/Users/homer/file_test.txt'

$ echo ${var%.*}                 

/Users/homer/file_test

$

$ var2='/Users/homer/file_test.tar.gz'

$ echo ${var2%.*}                     

/Users/homer/file_test.tar

$

$ echo ${var2%%.*}

/Users/homer/file_test

$

$ echo ${var2%.gz*}

/Users/homer/file_test.tar

注意:上面示例有两个自定义变量 var 和 var2,不要搞混了

小结

其实${}并不是专门为提取文件名或目录名的,它的使用场景是变量的提取和替换等等操作,

${}可以提取非常多的内容,并不一定是上面例子中的'/'或'.' ,也就是说,上面的使用方法只是它使用的一个特例。

看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

#:表示从左边算起第一个

%:表示从右边算起第一个

##:表示从左边算起最后一个

%%:表示从右边算起最后一个

换句话来说,#总是表示左边算起,%总是表示右边算起。

*:表示要删除的内容

对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;

对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。

这里的 '/' 或 '.' 的位置不能互换,即不能把号放在 # 或 ## 的右边,反之 % 或 %% 亦然。

例如:

${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

二、basename 和 dirname

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

1、basename 提取文件名

该命令的作用是从路径中提取出文件名,

使用格式:basename NAME [SUFFIX]

1)从路径中提出出文件名(带后缀),例子如下:

1

2

3

4

5

6

7

8

9

10

$ var='/Users/homer/file_test.txt'

$ basename $var

file_test.txt

$ echo $(basename $var)

file_test.txt

$ var2='/Users/homer/file_test.tar.gz'

$ basename $var2                     

file_test.tar.gz

$ echo $(basename $var2)  

file_test.tar.gz

2)从路径中提出出文件名(不带后缀),例子如下:

从上面命令的用法格式:basename NAME [SUFFIX] 中可以看到,后缀 [SUFFIX] 是一个可选项。

所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名参数来删除后缀(前提是知道后缀格式),

例子如下:

1

2

3

4

5

6

7

8

$ var='/Users/homer/file_test.txt'

$ echo $(basename $var .txt)     

file_test

$ var2='/Users/homer/file_test.tar.gz'

$ echo $(basename $var2 .gz)         

file_test.tar

$ echo $(basename $var2 .tar.gz)

file_test

2、dirname 提取目录

1)该命令的作用是从路径中提取出目录名

使用格式: dirname NAME

使用例子如下:

1

2

3

4

5

6

$ var='/Users/homer/file_test.txt'

$ echo $(dirname $var)               

/Users/homer

$ var2='/Users/homer/file_test.tar.gz'

$ echo $(dirname $var2)              

/Users/homer

这样就提取出了file.txt文件所在的目录。

2)该命令不仅能提取出普通文件所的目录,它能提取出任何文件和目录所在的目录,例如目录所在的目录,如下:

1

2

3

4

5

6

$ var2='/Users/homer/'

$ echo $(dirname $var2)

/Users

$ var2='/Users/homer'

$ echo $(dirname $var2)

/Users

它提取出了目录 homer 所在的目录 /Users

linux shell获取文件名和文件目录相关推荐

  1. linux获取文件后缀名,linux shell获取文件名和路径,basename/dirname/${}运用

    1. 获取文件名:basename shell本身提供了获取文件名的命令:basename,该命令可以从路径中提取出文件名(带后缀). 举个栗子: #/bin/bash File=/dir1/dir2 ...

  2. linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料

    下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助, 获取文件的MD5值: $ md5sum linuxmint ...

  3. linux shell获取当前执行路径

    linux shell 获取当前正在执行脚本的绝对路径 basepath=$(cd `dirname $0`; pwd) project_path=$(cd `dirname $0`; pwd) pr ...

  4. Linux shell获取时间和时间间隔(ms级别)

    说明:在进行一些性能测试的时候,有时候我们希望能计算一个程序运行的时间,有时候可能会自己写一个shell脚本方便进行一些性能测试的控制(比如希望能运行N次取平均值等),总之,这其中有一个需求可能就是获 ...

  5. linux shell获取路径的文件名及其目录名

    完整的文件名最长可以到达4096个字符. 那么,怎么知道哪个是文件名?哪个是目录名?就是利用斜线(/)来分辨. 其实,获取文件名或者是目录名,一般的用途是在写程序时进行判断. 下面我们简单以几个范例谈 ...

  6. linux的shell键盘输入,linux shell获取键盘输入

    linux shell从键盘获取输入 代码1: #!/bin/bash #提示"Input your choice:",把用户的输入保存入变量choice_user中 read - ...

  7. Linux Shell获取参数的方法

    传参用法 Linux Shell 如何获取参数的方法 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ ...

  8. linux shell 获取环境变量,bash shell中的环境变量

    环境变量--bash shell使用环境变量来存储系统相关数据,并允许将数据存储在内存中. 环境变量分为:全局环境变量 本地环境变量 目录全局环境变量 本地环境变量 设置全局环境变量 删除环境变量 P ...

  9. Linux Shell 获取端口范围内可用端口

    脚本内容 #!/bin/bash# portRange="80-81" # 可用于读取配置文件 # rangeStart=$(echo ${portRange} | awk -F ...

最新文章

  1. 面试官:一个线程OOM,进程里其他线程还能运行么?
  2. php字符串类型讲解
  3. linux下使用python_Python随笔(一)、Linux系统下python环境的安装
  4. python标准词匹配_python匹配目标词
  5. activexobject对象不能创建_面向对象设计方法(Object oriented)
  6. 【Python生成readme文件】——Markdown语法
  7. 程序员技术练级攻略(转载)
  8. load control template file /_controltemplates/taxonomypicker.ascx failed
  9. 20172319 《程序设计与数据结构》实验一报告
  10. 火速拿来用!对比 12,000 个 Vue.js 开源项目发现最实用的 TOP45!
  11. 修改telnet提示并非_iPhone修改微信提示音,iOS12可用,无需越狱详细教程
  12. Java8 Stream 流使用场景和常用操作
  13. 计算机绘图cad期末考试试题,工程制图考试
  14. 根据车辆型号自动生成车辆编号
  15. Docker镜像分层原理-联合文件系统(UnionFS)
  16. html网页文本框无法输入,浏览器打开网页文本框无法输入文字如何解决
  17. 第10节 文件共享服务器—创建/访问共享文件及禁用共享服务
  18. GAN for Image-to-image translation 2019年文章综述
  19. 举例mysql中group_concat()函数使用
  20. stm32采集脉冲信号_STM32单片机怎么产生脉冲信号控制步进电动机?

热门文章

  1. jqgrid 单元格自动换行且垂直居中
  2. Echarts实现两两重叠柱状图
  3. 入门web前端开发需要学习什么?
  4. 深入理解计算机系统(第三版)
  5. Mac版Excel怎样添加数据分析
  6. 美媒把第一名评给华为折叠手机,但却说出华为Mate X两个致命缺点
  7. 计算机基础的拼音是什么,第一讲计算机基础知识及微软拼音输入法
  8. python免注册调用大漠插件
  9. 焦化废水除氟技术,除氟树脂工艺
  10. ddrelease64 黑苹果_黑苹果必备驱动:VirtualSMC 系统管理控制器内核仿冒驱动 1.1.2...