Se o nome do arquivo for file-1.0.tar.bz2
, a extensão será bz2
. O método que você está usando para extrair a extensão ( fileext=${filename##*.}
) é perfeitamente válido¹.
Como você decide que deseja que a extensão seja tar.bz2
e não bz2
ou 0.tar.bz2
? Você precisa responder a essa pergunta primeiro. Então você pode descobrir qual comando shell corresponde à sua especificação.
-
Uma possível especificação é que as extensões devem começar com uma letra. Essa heurística falha em algumas extensões comuns, como
7z
, que podem ser melhor tratadas como um caso especial. Aqui está uma implementação do bash / ksh / zsh:basename=$filename; fileext= while [[ $basename = ?*.* && ( ${basename##*.} = [A-Za-z]* || ${basename##*.} = 7z ) ]]; do fileext=${basename##*.}.$fileext basename=${basename%.*} done fileext=${fileext%.}
Para portabilidade POSIX, você precisa usar uma instrução
case
para correspondência de padrões.while case $basename in ?*.*) case ${basename##*.} in [A-Za-z]*|7z) true;; *) false;; esac;; *) false;; esac do …
-
Outra especificação possível é que algumas extensões denotam codificações e indicam que é necessário mais decapagem. Aqui está uma implementação de bash / ksh / zsh (exigindo
shopt -s extglob
sob bash esetopt ksh_glob
sob zsh):basename=$filename fileext= while [[ $basename = ?*.@(bz2|gz|lzma) ]]; do fileext=${basename##*.}.$fileext basename=${basename%.*} done if [[ $basename = ?*.* ]]; then fileext=${basename##*.}.$fileext basename=${basename%.*} fi fileext=${fileext%.}
Observe que isso considera
0
como uma extensão emfile-1.0.gz
.
¹ ${VARIABLE##SUFFIX}
e construções relacionadas estão em POSIX , portanto eles funcionam em qualquer shell não-antigo estilo Bourne, como ash, bash, ksh ou zsh.