-1

我只想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一个变量。

4

5 回答 5

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
于 2012-04-04T01:11:27.053 回答
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
于 2012-04-04T01:13:06.163 回答
1
$ f='/root/abc/xzy/file_tar_src-5.2.8.23.tar.gz'
$ [[ $f =~ [^.]+\.[^.]+$ ]] && echo ${BASH_REMATCH[0]}
tar.gz
于 2012-04-04T12:59:03.373 回答
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}"
于 2012-04-04T10:02:12.673 回答
0

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

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

您是否正在尝试查找后缀是tar.gz还是tar.bz2plain 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'"
于 2012-04-04T04:12:30.227 回答