feed://
Anotaciones
Comentarios

multi(Un)packer

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!

Hay 3 comentarios

  1. on 30 Dic 2003 at 19:16 Jesús García Crespo (aka Sevein)

    ¡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!

  2. on 31 Dic 2003 at 11:03 r0sk

    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…) ;).

  3. on 31 Dic 2003 at 12:54 ebarbeito

    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

Trackback URI |