如何在shell脚本中单独获取扩展名?

时间:2012-04-04 01:01:24

标签: bash

我想从以下字符串中仅提取tar.gz

/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz

/root/abc/xyz/file_tar_src-5.2.tar.gz

/root/abc/xyz/file_tar_src-5.tar.gz

所有这些字符串(以及更多字符串)我只需tar.gz如何提取它们而不关心它们中的点数。我需要在变量中获取tar.gz

5 个答案:

答案 0 :(得分:1)

这很棘手,因为您不希望版本号匹配。我们需要更多的力量而不仅仅是简单的通配符。我们可以使用bash的内置=~正则表达式运算符来完成工作。

$ filename='/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz'
$ [[ $filename =~ \.([^0-9]*)$ ]]
$ ext=${BASH_REMATCH[1]}
$ echo "$ext"
tar.gz

答案 1 :(得分:1)

我真的不明白你为什么只需要tar.gz

$ x=/root/abc/xyz/file_tar_src-5.tar.gz
$ y=${x##*[0-9].}
$ echo $y
tar.gz

或者:

$ x=/root/abc/xyz/file_tar_src-5.tar.gz
$ y=`echo $x | grep -o 'tar\.gz$'`
$ echo $y
tar.gz

答案 2 :(得分:1)

$ f='/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz'
$ [[ $f =~ [^.]+\.[^.]+$ ]] && echo ${BASH_REMATCH[0]}
tar.gz

答案 3 :(得分:0)

不确定您正在寻找什么。您是否尝试确定文件是否以tar.gz结尾?

if [[ $filename == *.tar.gz ]]
then
     echo "$filename is a gzipped compressed tar archive"
else
     echo "No, it's not"
fi

您是在尝试查找后缀,无论是tar.gztar.bz2还是普通tar

$suffix=${file##*.tar}
if [[ "$suffix" = "$file" ]]
then
    echo "Not a tar archive!"
else
    suffix="tar.$suffix"
    echo "Suffix is '$suffix'"
fi

您是否对后缀感兴趣,但如果它是tar.gz,您要考虑后缀:

filename='/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz'
suffix=${filename##*.}   #This will be gz or whatever the suffix
rest_of_file=${filename%%.$suffix}  #This is '/root/abc/xzy/file_tar_src-5.2.8.23.tar'

# See if the rest of file has a tar suffix.
# If it does, prepend it to the current suffix
[[ $rest_of_file == *.tar ]] && suffix="tar.$suffix"

echo "The file suffix is '$suffix'"

答案 4 :(得分:0)

另一个:

pathname="/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz"

IFS='.'                               # field separator
declare -a part=( ${pathname} )       # split into an array
ext2="${part[*]: -2}"                 # use the last 2 elements
echo -e "${ext2}"