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...

7 comments:

  1. Nada como um cérebro com disponibilidade de tempo :-)

    ReplyDelete
  2. Tempo ?
    Estou a uma semana da minha defesa de doutorado !
    Terça que vêm enfrento a banca... definitivamente, não é porque tive tempo que fiz isso, mas para me distrair um pouco ...

    Por sinal, o blog serve para que me distraia compartilhando informação ...

    ReplyDelete
  3. Opa Mitre,

    Imaginei que as coisas já estivessem mais calmas com a proximidade da defesa... pelo visto, só após a defesa é que é possível relaxar :-)

    Mas vai dar tudo certo!

    abs

    ReplyDelete
  4. A corrida termina depois da linha de chegada !

    ReplyDelete
  5. Mitre, você podeira fazer o favor de postar no pastebin, pois quando colo a indentação não fica legal.

    ReplyDelete
  6. Faço melhor (para mim, pelo menos)

    Coloquei o arquivo em formato de texto puro no dropbox e o link (que é público) segue abaixo

    http://dl.dropbox.com/u/4917242/blogdomitre/extract

    Em breve, todos os meus arquivos de download similares também vão usar o dropbox.

    ReplyDelete
  7. Ótimo Script Realmente útil ! Valeu !

    ReplyDelete