Shell之提取文件名和目录名

简介:很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

使用${}

  1. ${var##*/}

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

     $ var=/dir1/dir2/file.txt
     $ echo ${var##*/}
     file.txt
    
  2. ${var##*.}

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

     $ var=/dir1/dir2/file.txt
     $ echo ${var##*.}
     txt
    
  3. ${var#*.}

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

     $ var=/dir1/dir2/file.tar.gz
     $ echo ${var#*.}
     tar.gz
    
  4. ${var%/*}

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

     $ var=/dir1/dir2/file.txt
     $ echo ${var##*.}
     /dir1/dir2
    
  5. ${var%%.*}

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

     $ var=/dir1/dir2/file.txt
     $ echo ${var##*.}
     /dir1/dir2/file
    

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的’/’或’.’。也就是说,上面的使用方法只是它使用的一个特例。

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

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

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

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的’/’和’.’)的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的’/’和’.’)的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

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

basename和dirname

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

  1. basename

    该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

    从路径中提出出文件名(带后缀)

     $ var=/dir1/dir2/file.txt
     $ echo $(basename $var)
     file.txt
    

    若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名

     $ var=/dir1/dir2/file.txt
     $ echo $(basename $var .txt)
     file
    
  2. dirname

    从路径中提取出目录名,使用方法为 dirname NAME

     $ var=/dir1/dir2/file.txt
     $ dirname $val
     /dir1/dir2
    

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

     $ var=/dir1/dir2/
     $ dirname $val
     /dir1
    

来源: http://blog.csdn.net/ljianhui/article/details/43128465