Pages

Tuesday, November 23, 2010

Descompactando arquivos no terminal do GNU/Linux

Não sei que foi a primeira pessoa a escrever a função extract transcrita abaixo do Wiki do Arch Linux (no momento, no final da página), mas que na verdade eu recebi de um amigo que a usa o tempo todo.
extract () {
   if [ -f $1 ] ; then
       case $1 in
           *.tar.bz2)   tar xvjf $1    ;;
           *.tar.gz)    tar xvzf $1    ;;
           *.bz2)       bunzip2 $1     ;;
           *.rar)       rar x $1       ;;
           *.gz)        gunzip $1      ;;
           *.tar)       tar xvf $1     ;;
           *.tbz2)      tar xvjf $1    ;;
           *.tgz)       tar xvzf $1    ;;
           *.zip)       unzip $1       ;;
           *.Z)         uncompress $1  ;;
           *.7z)        7z x $1        ;;
           *)           echo "don't know how to extract '$1'..." ;;
       esac
   else
       echo "'$1' is not a valid file!"
   fi
 }

A verdade é que achei essa função um pouco inconveniente. O arquivo não pode ter espaço no nome, trata apenas um arquivo por cada chamada de função e a estrutura não identifica o arquivo caso ele tenha nome com letras maiúsculas (tipo, arquivo *.ZIP).

Assim, fiz algumas modificações e esta está abaixo:
extract() { 
         for i in "$@";  do 
           if [ -f "$i" ]; then
          case "$i" in
              *.[tT][aA][rR].[bB][zZ]|*.[tT][bB][zZ])   tar xjvf "$i" ;; 
              *.[tT][aA][rR].[bB][zZ]2|*.[tT][bB][zZ]2) tar xjvf "$i" ;; 
              *.[tT][aA][rR].[gG][zZ]|*.[tT][gG][zZ])   tar xzvf "$i" ;;
              *.[gG][tT][gG][zZ])                       tar xzvf "$i" ;;
              *.[bB][zZ]2)                              bunzip2 "$i" ;;
              *.[rR][aA][rR])                           rar x -o+ "$i" ;;
              *.[gG][zZ])                               gunzip "$i" ;;
              *.[tT][aA][rR])                           tar xvf "$i" ;;
              *.[zZ][iI][pP])                           unzip -o "$i" ;;
              *.Z)                                      uncompress "$i" ;;
              *.7[zZ])                                  7z x "$i" ;;
              *)    echo "don't know how to extract '$i' ..." ;;
          esac
           else 
             echo "$i is not a valid file"
           fi
         done 
   }

Essa função aceita tantos argumentos quando o bash suporte e identifica a maioria dos problemas de maiúsculas e minúsculas. Além de não apresentar problemas ao manipular arquivos com espaços no nome.

Para usá-la, basta adicionar a mesma no arquivo ~/.bashrc...

Quem tiver sugestões para aprimorar essa função, pode deixar um "oi" pelo comentários...