Concepto de Script para comprimir

El otro día alguien planteó un problema para un script de bash en los foros de Desdelinux. Tenía que comprimir en *.tar.gz todos los archivos de un directorio. Ojo, todos los archivos, no todos los archivos y todos los directorios y los archivos de esos directorios, …

También había que poder especificar un tamaño máximo de los archivos a comprimir.

Wada, publicó un script que hacía exactamente lo que pedía el chaval, para un trabajo de la facultad, me imagino.

La cosa es que desconocía el comando stat. Estaba pensando en parsear el tamaño del fichero directamente desde la salida de ls y al ver la solución de Wada, me piqué y esta tarde hice un script alternativa.

#!/bin/bash

function checkName {
	j=1
	for (( i=1; j!=0; i++ )); do
		FILENAME="$(date +%Y%m%d)-backup-$i"
		if [[ ! -f $FILENAME.tar.gz ]]; then
			j=0
		fi
	done
	FILENAME=$FILENAME.tar
	return 0
}

function generateList {
	LIST="list.txt"
	if [[ -n $2 ]]; then
		ls -napB $1 | sed "/^total /d" | sed "/ -> /d" | grep -v "/" > $LIST.0
		while read -a line; do
			if [[ ${line[4]} -le $2 ]]; then
				FILE=""
				j=1
				for (( i=8; j!=0 ; i++ )); do
					if [[ -z ${line[i]} ]]; then
						j=0
					fi
					FILE="$FILE ${line[i]}"
				done
				echo $FILE >> $LIST
			fi
		done < $LIST.0
		rm $LIST.0
	else
		ls -1apB $1 | sed "/ -> /d" | grep -v "/" > $LIST
	fi
	return 0
}

function compress {
	while read line; do
		if [[ ! -f $2 ]]; then
			tar --create --file=$2 $line
		else
			tar --append --file=$2 $line
		fi
	done < $1
	gzip -c $2 > $2.gz
	rm $1 $2
	return 0
}

function help {
	printf " Compress all directory files into *.tar.gz\n"
	printf " Usage: script.sh <directory>\n"
	printf "        script.sh <directory> <maxFileSize>\n"
	return 0
}

if [[ -z $1 || ! -d $1 ]]; then
	help
else
	checkName
	generateList $1 $2
	compress $LIST $FILENAME
fi
exit 0

66 líneas frente a 51. Bueno, me ha salido un poco más largo.

Comprime archivos normales y los ocultos. Omite los enlaces. Y no sobrescribe el archivo comprimido, si existe.

Aunque el script sea totalmente funcional y haga todo lo que se supone que tiene que hacer, me suelta un error que no he tenido el talento de debuggear:

tar: *****: No se puede stat: No existe el fichero o el directorio
tar: Exiting with failure status due to previous errors

Tuve que utilizar las opciones largas de tar para que todo funcionara correctamente, pues por lo visto, una cosa que desconocía, tar falla en entender sus propias opciones cortas. La red esta llena con ese error y medias soluciones sin que nadie explique por qué pasa eso.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s