Hola a todos; hoy primer día de Verano, quiero traeros un pequeño script diseñado para "vagos" que no quiere recordar toda la sintaxis relacionada con la descompresión de archivos. Existen numerosos formatos de compresión y a veces el recordarlo todos puede resultar difícil; especialmente cuando trabajamos con ficheros basados en tar; obligándonos a consultar por Internet u otras fuentes la sintaxis de descompresión correcta. ¿Pero para qué tener que recordar dicha sintaxis cuando podemos hacer que un script o servicio lo haga por nosotros? Es por eso que trasteando un poco finalmente he creado una pequeña solución que puede facilitarnos considerablemente dicha tarea; en este caso en concreto he creado un demonio (un servicio) que descomprima automáticamente un fichero. Si bien podemos hacer que simplemente sea un script que se ejecute únicamente cuando queremos.
Para ello lo primero que he creado ha sido el script que inicializará y detendrá el demonio; un script que incluiremos en el directorio /etc/init.d para que, en caso de ser necesario, se inicializará automáticamente el arranque. A dicho script lo he llamado demonio_dcompres.sh y tendría el siguiente contenido:
- #!/bin/bash
- ### BEGIN INIT INFO
- # Provides: dcompres
- # Required-Start: $network $named $remote_fs $syslog
- # Required-Stop: $network $named $remote_fs $syslog
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: dcompres
- # Description: Descompresor automatico
- ### END INIT INFO
- PIDFILE=/tmp/dcompres.pid
- SRV="dcompres"
- function status()
- if [ -f ${PIDFILE} ];
- then
- echo "${SRV} esta en marcha"
- else
- echo "${SRV} esta parado"
- fi
- function start(){
- echo -n $"Iniciando servicio ${SRV}: "
- /usr/bin/dcompres >/dev/null 2>&1 &
- RETVAL=$?
- echo $! > $PIDFILE
- if [ ${RETVAL} -eq 0 ];
- then
- echo "Se ha iniciado ${SRV}"
- else
- echo "No se ha podido iniciar ${SRV}"
- fi
- echo
- }
- function stop(){
- echo -n $"Parando servicio ${SRV}... "
- SERV=$(ps -e |grep ${SRV} |awk '{print $1}')
- kill -9 ${SERV}
- echo "Servicio detenido"
- }
- function restart(){
- stop
- sleep 10
- start
- }
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- status)
- status
- ;;
- *)
- echo $"Usar: $0 {status|start|stop|restart}"
- exit 1
- esac
- exit 0
Si observáis bien, este script controla otro llamado /usr/bin/dcompres, script que controlaremos como un servicio gracias a este script añadido en init.d. Dicho script puede ser más o menos complicado dependiendo de nuestras necesidades; en este caso he creado un script bastante completo que intenta contemplar diferentes posibilidades, que sería el siguiente
- #!/bin/bash
- #BUCLE INFINTO HASTA QUE LO PAREMOS
- ACTIVE='y'
- DIRECTORIO='/home/ivan/Descargas/'
- while [ ${ACTIVE} == 'y' ];
- do
- cd $DIRECTORIO
- ls $DIRECTORIO |grep ".tar" > /tmp/descom.txt
- ls $DIRECTORIO |grep ".bz2" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".gz" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".rar" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".zip" >> /tmp/descom.txt
- while read FICHERO
- do
- FICHERO2=`echo $FICHERO | sed 's/ /_/g'`
- if [ "$FICHERO" != "$FICHERO2" ];
- then
- mv "$FICHERO" $FICHERO2
- fi
- #TAR
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "tar" ];
- then
- tar -xvf $FICHERO2
- rm ${FICHERO2}
- #BZ2 Y TAR.BZ2
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "bz2" ];
- then
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 2 | rev) == "tar" ];
- then
- tar -xjf $FICHERO2
- else
- bzip2 -d $FICHERO2
- fi
- rm ${FICHERO2}
- #GZ Y TAR.GZ
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "gz" ];
- then
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 2 | rev) == "tar" ];
- then
- tar -xzf $FICHERO2
- else
- gzip -d $FICHERO2
- fi
- rm ${FICHERO2}
- #RAR
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "rar" ];
- then
- rar -x $FICHERO2
- rm ${FICHERO2}
- #ZIP
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "zip" ];
- then
- unzip $FICHERO2
- rm ${FICHERO2}
- fi
- done < /tmp/descom.txt
- done
En este script hay un par de puntos "especiales" que en mi opinión merecen la pena ser mencionados. El primer punto sería el uso de la variable FICHERO2 con sed. Por si no encontraseis dicha línea os la pondré a continuación:
- FICHERO2=`echo $FICHERO | sed 's/ /_/g'`
- if [ "$FICHERO" != "$FICHERO2" ];
- then
- mv "$FICHERO" $FICHERO2
- fi
Esta acción tiene un motivo en concreto. Imaginemos que el fichero comprimido que tenemos en el directorio contiene espacios; dichos espacios no dejará trabajar con el fichero adecuadamente, así que lo primero que haríamos sería transformar los espacios en blanco en _. Obviamente, revisaríamos si el fichero tendría espacios para evitar renombrar el fichero en vano; he ahí el motivo del if. El comando de sustitución tiene la sintaxis:
FICHERO_NUEVO=`echo $FICHERO_ORIGINAL | sed 's/CADENA_ORIGINAL/CADENA_NUEVA/g'`
Otro punto que a tener en cuenta en el que probablemente os habréis fijado es que hago uso del parámetro |rev en las condiciones introducidas. El uso de dicho rev es debido a que con ello nos aseguraremos que siempre contará los puntos desde el final del fichero y no desde el principio; puntos que uso en este script como referencia para obtener el tipo de compresión (zip, tar, rar...). Esto es debido a que existen muchos ficheros que contienen la versión junto con su nombre (ejemplo nmap-7.12.tar.bz2) y siempre querremos asegurarnos que contaremos el último o penúltimo punto (dependiendo de nuestra necesidad), independientemente de los puntos que hayamos encontrado antes. La sintaxis sería:
ls fichero | rev | cut -d'.' -f (número_posición_desde_el_final) | rev
Si pusiésemos un 1, haríamos referencia a la última posición, mientras que con un 2 haríamos referencia a la penúltima y así sucesivamente...
Con esto tendríamos un script muy sencillo y funcional que hará que las dificultades de una tarea de descompresión, sean tareas del pasado.
Espero que os haya resultado útil.
Saludos.
No hay comentarios :
Publicar un comentario