- No sé hacer, que el tamaño devuelto en la ejecución se exprese en bloques de 1024bytes=1KB (Funcion computingSize())
Código:
#!/bin/bash
shopt -s dotglob #recuperar ocultos
##################################muestra error y fuerza salida#####################################
function mostrarError () {
echo "ERROR. Modo de empleo: midu [opciones] [camino1 camino2 caminos3 ...]"
exit 1
}
########################################Funcion recursiva###########################################
tam_parcial=0 #variable global
function computingSize(){
#Guardamos las opciones en variables locales
local opcion_d
local opcion_s
local opcion_exlude
local ruta=$4
#si el camino es un archivo regular la unica opcion a tener en cuenta es --exclude
if [ -f $ruta ]; then
#se calcula el tamano (aux). Vale tambien con wc -c (tamano en bytes es valido)
#stat con opciones adecuadas o en KB con ls -s
tam_parcial=$aux
fi
#si el camino es un directorio
if [ -d $ruta ]; then
local nodo
#lista todo lo que tiene la ruta archivos y directorios "ls" y los va ha recorrer uno a uno por nodo
for nodo in $ruta/*; do
#si es directorio
if [[ -d $nodo ]] ; then
#Guardar el valor de tam_parcial en variable local (e.j: temp)
temp=$tam_parcial
#resetear antes de la llamada a funcion recursiva
tam_parcial=0
computingSize $opcion_d $opcion_s $opcion_exlude $nodo
#imprimir $tam_parcial
#print(tam_parcial)
#se recupera/restaura el valor anterior de tam_parcial y se acumula con lo obtenido
#en la llamada recursiva
tam_parcial <- $(expr $tam_parcial + $temp)
#si es archivo regular
elif [[ -f $nodo ]]; then
#Calculando con wc -c
tam_archivo= wc -c "$nodo"
#acumulamos
tam_parcial=$(expr $tam_parcial + $tam_archivo)
fi
done
fi
}
############################Comprobacion de errores#########################################
OPCION=""
CONTADOR=1 #Empezamos en el argumento 1
OPCION_D=99999;
OPCION_S=99999;
OPCION_EXCLU=99999;
for i in $@ ; do
case $i in
"-s" | "-d" | "--exclude")
#Error si ya se ha recogido uno o mas caminos
if [ $RUTAS ] ; then
mostrarError
fi
case $i in
"-d" | "--exclude")
#Error si -d o --exclude es el utimo param (y no tienen ningun valor detras)
if [ $CONTADOR -eq $# ]; then
mostrarError
fi
OPCION=$i
;;
"-s")
#La opcion -s no tiene ningun param detras (Ruta)
OPCION_S=1
;;
esac
;;
*)
##Recuperamos los parametros para la opcion y/o la ruta##
case $OPCION in
#Deberia recoger ahora el param de -d
"-d")
NIVELES=`expr $i / 1` #Paso a entero
#Si no hay niveles
if [ ! $NIVELES ] ; then
mostrarError
fi
#si los niveles son negativos
if [ $NIVELES -lt 0 ] ; then
mostrarError
fi
OPCION_D=$NIVELES
;;
#Param de --exclude
"--exclude")
OPCION_EXCLU=$i
;;
"") #Para recoger el camino. $i representa un camino dse anade al array vector
RUTAS+=("$i")
;;
esac
#resetea al coger la opcion adecuada
OPCION=""
;;
esac
CONTADOR=$(expr $CONTADOR + 1)
done
#####################################################################
# Tratar cuando no se especifica camino
if [ ! $RUTAS ] ; then
computingSize $OPCION_D $OPCION_S $OPCION_EXCLU "."
else
for i in "${RUTAS[@]}"; do
# Llamar a computingSize
computingSize $OPCION_D $OPCION_S $OPCION_EXCLU $i
done
fi