multi(Un)packer
Martes , 30 de Diciembre de 2003. Enrique Barbeito García
Hace unos días encontré una idea genial para ponerme a escribir otro script en BASH que me fuera sumamente útil y, a la vez, intentar que también lo fuese para cualquiera. En los foros de Lmulespana, concretamente en los foros dedicados a la programación: [ aquí ], encontré un script llamado uz.sh, escrito por Rondagorn, el cual sirve para descomprimir en la carpeta desde la que se llama al script los archivos comprimidos del tipo gzip, zip, bzip2 o rar :) Su script me sirvió para descubrir la gran utilidad del comando file pero, más importante que eso, me dio la idea de escribir algo parecido que trabajara con unos cuantos formatos de compresión más y que sirviera no solo para descomprimir, que también comprimiera uno o más archivos y que listara por pantalla los ficheros contenidos en uno o más ficheros comprimidos que deseamos ver.
multi(Un)packer se encuentra en la versión 2.0_rc1, creo que ya está terminado y por ello es que he decidido ponerlo por aquí. Todavía es una release candidate digamos porque no he tenido la oportunidad de probarlo demasiado (bueno, he hecho muchísimas pruebas pero seguramente queden cosas por arreglar/probar). Requiere de varias herramientas de las cuales se vale para realizar ficheros comprimidos, descomprimir o listar contenidos en diferentes formatos:
# Requirements: # - tar (http://www.gnu.org/software/tar/) # - gzip (http://www.gnu.org/software/gzip/gzip.html) # - zip (ftp://ftp.freesoftware.com/pub/infozip/Zip.html) # - rar (http://www.rarsoft.com/) # - unace (http://www.winace.com/) # - arj (http://arj.sourceforge.net/) # # Description: # Utilidad para el uso de multiples compresores. # Trabaja con tipos de archivo: tar, gzip, bzip2, zip, rar, ace y arj # Comprime, descomprime y lista el contenido de archivos comprimidos
nombre: mup.sh - BASH script
Y poco más que decir antes de pastearos el código… solo decir que, a diferencia de otros scripts que haya puesto por aquí, creo que este si puede tener verdadera utilidad para cualquier usuario de escritorio que trabaje con cualquier tipo de formato de compresión más usual; somos muchos los que conectamos a redes P2P y descargamos discos, videos, y demás souvenires que vienen debidamente comprimidos en zip, rar, ace, …
Un ejemplo de uso sería, si hubiésemos descargado un archivo empaquetado con tar: “G-Unit - Beg For Mercy.tar” desde nuestro xMule (~/.xMule/Incoming/G-Unit - Beg For Mercy.tar)
meteora:~$ mup.sh -d .xMule/Incoming/G-Unit - Beg For Mercy.tar mup.sh: desempaquetando ".xMule/Incoming/G-Unit - Beg For Mercy.tar" ... Terminado. 1 fichero(s) descomprimido(s). meteora:~$ ls |grep G-Unit drwxr-xr-x 4 neuronal users 4,0K 2003-11-04 14:29 G-Unit-Beg_For_Mercy-(Retail)-2003-RNS/
Ahi lo tenemos :-) Utilizamos el parámetro “-d” (de descomprimir) y otro parámetro que es el fichero citado anteriormente. Lo descomprime en el directorio en donde nos encontremos, en este caso en nuestro directorio $HOME
Por último decir que tengo pensado añadir una funcionalidad extra especial para usuarios de Gentoo Linux. No va a ser gran cosa (solo es una chorrada jeje), consistirá en valerse de emerge para realizar aquellas instalaciones de los paquetes que requiera el script y el usuario no tenga instalados; advertirá de que X utilidad no se encuentra instalada y preguntará si se desea proceder a instalarla –dependiendo de la respuesta del usuario, el script hará una llamada a emerge o finalizará la ejecución del mismo–
A continuación tenéis el código del script.
# # script : multi(Un)packer # version : 2.0_rc1 # author : enrique@barbeito.org # date : mar dic 30 16:05:14 CET 2003 # # Requirements: # - tar (http://www.gnu.org/software/tar/) # - gzip (http://www.gnu.org/software/gzip/gzip.html) # - zip (ftp://ftp.freesoftware.com/pub/infozip/Zip.html) # - rar (http://www.rarsoft.com/) # - unace (http://www.winace.com/) # - arj (http://arj.sourceforge.net/) # # Description: # Utilidad para el uso de multiples compresores. # Trabaja con tipos de archivo: tar, gzip, bzip2, zip, rar, ace y arj # Comprime, descomprime y lista el contenido de archivos comprimidos # # ## # ========= # ChangeLog # ========= # 2003-12-29 ebarbeito # * soporte para tipo de archivos TAR # * tratamiento de ficheros con espacios en sus nombres arreglado # gracias a pushakk (#linux @ irc-hispano.org) por la ayuda :-) # # 2003-12-22 ebarbeito # * funcion "fExt" creada --para simplificar codigo-- # # 2003-12-19 ebarbeito # * version 2.0_rc1 out! # * "fListar" retocada # * soporte para tipo de archivos ARJ # * selector "case" de la funcion "fComprime" # refinado con el uso de expresiones regulares # * Agrupacion de codigo en "fArgs" para simplificar # * funcion "fComprime" creada # # 2003-12-17 ebarbeito # * funcion "fListar" creada # * funcion "fDecomprimir" ampliada: # soporte para tipo de archivos RAR # soporte para tipo de archivos ACE # # 2003-12-16 ebarbeito # * funcion "fVersion" creada. # * funcion "fHelp" creada. # # 2003-12-15 ebarbeito # * version 1.0 # * reordenacion del codigo # * changelog iniciado # # ## # ==== # TODO # ==== # # **** creacion de flags especial para Gentoo (instalacion de compresores) # DONE soporte para gzip, bzip2, zip, rar, ace (listar contenido) # DONE soporte para gzip, bzip2, zip, rar, ace (compresion) # DONE centralizar la ayuda del script # DONE soporte para gzip, bzip2, zip, rar, ace (descompresion) # DONE TODO iniciado # # ## #!/bin/bash # # constantes y variables globales iniciadas # kSCRIPT=`basename $0` kVERSION=2.0_rc1 totales=0 # # fVersion() , muestra la version y autor del script # ================================================== function fVersion { echo -e "\033[1;37m$kSCRIPT\033[0m version $kVERSION, 20031219 (!c)" echo -e "Enrique Barbeito García, " } # # fHelp() , muestra ayuda de uso del script # ========================================= function fHelp { echo -e "Uso: `basename $0` [opcion] fichero1 [fichero2 fichero3...]" echo echo -e "Opciones disponibles:" echo -e " -c out fichero1 [fichero2...] Comprime uno o varios ficheros generando el fichero "out"" echo -e " -d fichero1 [fichero2...] Descomprime uno o varios ficheros en el directorio actual." echo -e " -l fichero1 [fichero2...] Lista el contenido de uno o varios ficheros comprimidos." echo -e " -h, --help Muestra esta ayuda y finaliza." echo -e " -v, --version Informa de la version y finaliza." } # # fArgs() , muestra error cuando no se introducen los argumentos necesarios # ========================================================================= function fArgs { echo -e "$kSCRIPT: numero de argumentos insuficiente" echo -e "Utilice '$kSCRIPT --help' para obtener ayuda." } # # fExt() , muestra error cuando se introducen extensiones no validas # ================================================================== function fExt { echo -e "$kSCRIPT: Extension del fichero de $1 desconocida." echo -e "Debes utilizar cualquier nombre de archivo con extension:" echo -e " - .tar.gz : si quieres crear un fichero "tar.gz"" echo -e " - .tgz : si quieres crear un fichero "tgz"" echo -e " - .gz : si quieres crear un fichero "gz"" echo -e " - .bzip2 : si quieres crear un fichero "bzip2"" echo -e " - .tbz2 : si quieres crear un fichero "tbz2"" echo -e " - .zip : si quieres crear un fichero "zip"" echo -e " - .rar : si quieres crear un fichero "rar"" echo -e " - .ace : si quieres crear un fichero "ace"" echo -e " - .arj : si quieres crear un fichero "arj"" } # # fComprime() , procedimiento de generacion de un archivo comprimido # ================================================================== function fComprime { local out="$1" extension=`expr "$1" : '.*\(\..*\)' '|' "$1"` shift case "$extension" in .[Gg][Zz]) tar cvfz "$out" "$@" > /dev/null let totales+=$# ;; .[Tt][Gg][Zz]) tar cvfz "$out" "$@" > /dev/null let totales+=$# ;; .[Bb][Zz][Ii][Pp]2) tar cvfj "$out" "$@" > /dev/null let totales+=$# ;; .[Tt][Bb][Zz]2) tar cvfj "$out" "$@" > /dev/null let totales+=$# ;; .[Zz][Ii][Pp]) zip -9 "$out" "$@" > /dev/null let totales+=$# ;; .[Rr][Aa][Rr]) rar a "$out" "$@" > /dev/null let totales+=$# ;; .[Aa][Cc][Ee]) echo -e "no he encontrado compresor para ace, lo siento :(" ;; .[Aa][Rr][Jj]) arj a "$out" "$@" > /dev/null let totales+=$# ;; *) fExt "salida" ;; esac } # # fDescomprime() , procedimiento de descompresion de archivos # =========================================================== function fDescomprime { case "$2" in 'gzip') echo -e "$kSCRIPT: descomprimiendo "$1" ..." tar xvfz "$1" > /dev/null let totales+=1 ;; 'bzip2') echo -e "$kSCRIPT: descomprimiendo "$1" ..." tar xvfj "$1" > /dev/null let totales+=1 ;; 'tar') echo -e "$kSCRIPT: desempaquetando "$1" ..." tar xvf "$1" > /dev/null let totales+=1 ;; 'Zip') echo -e "$kSCRIPT: descomprimiendo "$1" ..." unzip "$1" > /dev/null let totales+=1 ;; 'RAR') echo -e "$kSCRIPT: descomprimiendo "$1" ..." unrar x "$1" > /dev/null let totales+=1 ;; 'ACE') echo -e "$kSCRIPT: descomprimiendo "$1" ..." unace e "$1" > /dev/null let totales+=1 ;; 'ARJ') echo -e "$kSCRIPT: descomprimiendo "$1" ..." arj e "$1" > /dev/null let totales+=1 ;; *) if test ! -e "$1" then echo -e "$kSCRIPT: $1 no existe." else echo -e "$kSCRIPT: el tipo de archivo "$2" no esta soportado." fi ;; esac } # # fListar() , muestra el contenido de uno/varios archivo(s) comprimido(s) # ======================================================================= function fListar { local lookFile="$1" extension=`expr "$1" : '.*\(\..*\)' '|' "$1"` shift case "$extension" in .[Gg][Zz]) tar tvfz "$lookFile" let totales+=1 ;; .[Tt][Gg][Zz]) tar tvfz "$lookFile" let totales+=1 ;; .[Bb][Zz][Ii][Pp]2) tar tvfj "$lookFile" let totales+=1 ;; .[Tt][Bb][Zz]2) tar tvfj "$lookFile" let totales+=1 ;; .[Tt][Aa][Rr]) tar tvf "$lookFile" let totales+=1 ;; .[Zz][Ii][Pp]) unzip -l "$lookFile" let totales+=1 ;; .[Rr][Aa][Rr]) rar t "$lookFile" let totales+=1 ;; .[Aa][Cc][Ee]) unace -l "$lookFile" let totales+=1 ;; .[Aa][Rr][Jj]) arj l "$lookFile" let totales+=1 ;; *) fExt "entrada" ;; esac } # ==================== # # PROGRAMA PRINCIPAL # # ==================== # case "$1" in '-c') shift if [ $# -lt 2 ] then fArgs echo else fComprime "$@" echo echo -e "Terminado. $totales fichero(s) comprimido(s)." echo fi ;; '-d') shift if [ $# -lt 1 ] then fArgs echo else for fichero in "$@" do fileType=`file "$1" | cut -f 2 -d : |cut -f 2 -d ' '` fDescomprime "$1" $fileType $totales shift done echo echo -e "Terminado. $totales fichero(s) descomprimido(s)." echo fi ;; '-l') shift if [ $# -lt 1 ] then fArgs echo else for fichero in "$@" do echo fListar "$1" shift done echo echo -e "Terminado. $totales fichero(s) listado(s)" fi ;; '-h') fHelp echo ;; '--help') fHelp echo ;; '-v') fVersion echo ;; '--version') fVersion echo ;; *) fArgs echo ;; esac #
nombre: mup.sh - BASH script
¡A disfrutarlo con salud!
¡Te has marcado una de fantástico! Me encantan tus posts del weblog relacionados con estas cosillas, ¡es lo mejor de lo mejor! Y, además, orientado a Gentoo no me viene mal, xD!
Me gusta el script, y la forma que tienes de abstracción en la programación. Todo modular, en funciones, comentado…. creo que en la vida llegaré a ser así, soy de los de: “cuan más chapucero vaya todo mejor, soy el más vago del mundo”. xD.
Por otro lado, como estamos a 31, felíz año y que el 2004 venga cargado de cosas buenas (copas, alcohol, linux, regalos, amor, salud…) ;).
A ver si hoy le saco tiempo al tiempo y consigo terminar la última cosa del ToDo ese patatero del script: gentooizarlo :)
Sevein, a mí también me mola poner cosillas de estas precisamente (lo malo que no soy capaz más que hacerlo muy ocasionalmente XD)
Me gustaría hacerlo todo “super modular” pero no solo eso, sino que las funciones fuesen lo más genéricas posibles para poder reutilizarlas en otras situaciones. Supongo que eso es un síntoma de que has escrito un par de funciones “de calidad”, pero yo lo veo muy muy difícil jeje
Si vais utilizando el script para vuestras descompresiones y os topáis con cosas que no marchan bien ¡avisar eh! :D corregirlas o enviarme patches XD
Feliz año nuevo r0sk, ¡y a todos!. Que los Reyes se porten bien con vosotros y esas cosas.
Saludos