linux shell获取文件名和文件目录

  • Post author:
  • Post category:linux


需要获取文件名和文件所在的目录(文件夹)。我所知的只有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