Un poco de código Shell Unix


Volviendo al mantenimiento, me preguntaban como hacer un script para mantener los file system de manera automática ciertas fotos o profundidad de días. Dado que tengo el código para modo UNIX y modo Windows. Vamos a publicarlo, por qué no, así cuando busque o me lo pidan buscar, que se venga aquí quien quiera y auto-consuma.

Un poco de código UNIX. Para el profano, es fácil de usar, simplemente usa como argumento un fichero de entrada, donde en el fichero de entrada se indica la ruta, días y tipo de borrado. En todo caso, si te vas a aventurar a probar semejante script, te recomiendo hacer uso de él, con una carpeta con ficheros de prueba en una ruta de prueba.



#!/usr/bin/ksh
# Nombre.....: adnent5purga_tmp.sh
#=======================================================================
# ADNENT. adnent                                               15/04/2015
#=======================================================================
###################################################################################################
# CREACION: 15/04/2015                                                                            #
# AUTOR:    Javier Blanco Romero                                                                  #
# DESCRIPCION: Script para borrar logs y ficheros temporales antiguos. Se utiliza una             #
#              lista con las rutas de los directorios que se quieren borrar junto con             #
#              el número de días a partir de los cuales se borrarán.                              #
# CONFIGURACION:                                                                                  #
# {Fichero}: Fichero con las rutas y los días de purgado                                          #
#                                                                                                 #
# SINTAXIS:                                                                                       #
# adnent5purga_tmp.sh {Fichero}                                                                   #
#                                                                                                 #
# FORMATO DEL {Fichero}:                                                                          #
#                                                                   #
#                                                                                                 #
# DONDE:                                                                                          # 
#           es la ruta sobre la que se quiere aplicar mantenimiento                         #
#       maxima antiguedad de días a conservar                                           #
#   tipo de borrado a aplicar. Valores:                                             #
#       - FICH: Borrado solo de ficheros de                                                 #
#       - ALLFICH: Borrado solo de ficheros de  y de sus subcarpetas                        #
#       - ALL: Borrado de todo el contenido : ficheros y directorios                        #
#  en el fichero se puden inlcuir comentarios poniendo como caracter incial de                    #
#  la fila #                                                                                      #
#                                                                                                 #
# CODIGOS DE SALIDA:                                                                              #
#     0 -> EJECUCION CORRECTA                                                                     #
#     1 -> ERROR EN LOS PARAMETROS DE ENTRADA                                                     #
#     2 -> ERROR EN EL PARÁMETRO DE TIPO DE BORRADO                                               #
#     3 -> ERROR NO EXISTE EL FICHERO DE DATOS                                                    #
#     4 -> ERROR EL DIRECTORIO NO EXISTE                                                          #
#     * -> CÓDIGO DE ERROR INCORRECTO                                                             #
# ================================================================================================#
# Modificaciones                                                                                  #
#  Autor     Fecha       Version  Comentario                                                      #
# ---------  ----------  -------  --------------------------------------------------------------  #
# Lab adnent    01/04/2014   1.0     Version inicial                                              #
# Lab adnent    15/04/2015   1.1     Javier Blanco Romero                                         #
# Lab adnent    20/05/2015   1.3     Javier Blanco Romero                                         #
#                                                                                                 #
###################################################################################################

#-------------------------------------------------------------------------------------------------#
# Definicion de la funcion utilizada para escribir mensajes en la pantalla:
#-------------------------------------------------------------------------------------------------#
f_pant () {
   echo NOTA ADNENT: `date "+%d/%m/%Y - %H:%M:%S"` -- "${*}"
}


#-------------------------------------------------------------------------------------------------#
# Definicion de la funcion utilizada para escribir mensajes en el log:
#-------------------------------------------------------------------------------------------------#
f_log () {
   echo NOTA ADNENT: `date "+%d/%m/%Y - %H:%M:%S"` -- "${*}" >> ${LOG_FILE}
}

#-------------------------------------------------------------------------------------------------#
# Definicion de la funcion utilizada para escribir mensajes en fichero de salida:
#-------------------------------------------------------------------------------------------------#
f_out () {
   echo "${*}" >> ${OUTPUT_FILE}
}

#-------------------------------------------------------------------------------------------------#
# Definicion de la funcion utilizada para escribir mensajes en el log y en pantalla:
#-------------------------------------------------------------------------------------------------#
f_tee () {
   echo NOTA ADNENT: `date "+%d/%m/%Y - %H:%M:%S"` -- "${*}" | tee -a ${LOG_FILE}
}

#-------------------------------------------------------------------------------------------------#
# Definicion de la funcion utilizada para controlar los errores:
#-------------------------------------------------------------------------------------------------#
f_control () {
 CODRET=${1}
 case ${CODRET} in
 0)  # Finalizacion correcta
 exit ${CODRET}
 ;;
    1)  # Error en los parametros de entrada
        f_tee "* Error ${CODRET} en los parametros de entrada"
        f_pant "CONSULTAR FICHERO DE LOG: <${LOG_FILE}>"
        f_tee "FINAL DE LA EJECUCION DEL SCRIPT"
        exit ${CODRET}
 ;;
    2)  # Error en el parámetro de tipo de borrado
        f_tee "*** ERROR: Error ${CODRET} en el parámetro de tipo de borrado en la línea '${2}'"
 f_tee "----------------------------------------------------------------------"
     f_tee "Ha habido errores, consulta el fichero de log ${LOG_FILE}"
     f_tee "----------------------------------------------------------------------"
     echo
        ;;
    3)  # Error no existe el fichero de datos 
        f_tee "*** ERROR: Error ${CODRET} no existe el fichero de datos: '${2}'"
        f_pant "CONSULTAR FICHERO DE LOG: <${LOG_FILE}>"
        f_tee "FINAL DE LA EJECUCION DEL SCRIPT"
        exit ${CODRET}
        ;;
    4)  # Error el directorio no existe
        f_tee "*** ERROR: Error ${CODRET} el directorio a purgar no exite, línea '${2}'"
 f_tee "----------------------------------------------------------------------"
     f_tee "Ha habido errores, consulta el fichero de log ${LOG_FILE}"
     f_tee "----------------------------------------------------------------------"
        ;;
    *)  # Código de error incorrecto 
        f_tee "* El código de error ${CODRET} no existe, revisar el script"
        f_pant "CONSULTAR FICHERO DE LOG: <${LOG_FILE}>"
        f_tee "FINAL DE LA EJECUCION DEL SCRIPT"
        exit ${CODRET}
        ;;
    esac
}


##############################################################################################
# Se comprueban los parametros de entrada
##############################################################################################
if [ $# -ne 1 ];
then
 f_pant " USO: ${0} "
 f_control 1 
else
 f_pant "PARAMETROS CORRECTOS"
fi

##############################################################################################
# Definicion de variables y parametros
##############################################################################################
FICHERO=${1}
CONFIG=/adnent/SCRIPTS/UTIL/CFG/${FICHERO} # Fichero de datos de borrado
PATH_LOG=/adnent/SCRIPTS/UTIL/LOG
LOG_FILE=${PATH_LOG}/${0##*/}_`date +'%Y%m%d_%H%M%S'`.log


############
### MAIN ###
############
f_tee "----------------------------------------------------------------------"
f_tee "Comienzo del Proceso ${0##*/}"
f_tee "----------------------------------------------------------------------"
echo

# Comprobar la existencia del fichero de datos
if [ ! -f ${CONFIG} ]; then
 f_control 3  ${CONFIG}
fi

# Inclusión del contenido del fichero de datos dentro del log
f_tee " CONTENIDO DEL FICHERO DE DATOS:"
cat ${CONFIG} | tee -a ${LOG_FILE}
f_tee "----------------------------------------------------------------------"
f_tee " INICIO DEL BORRADO"
f_tee "----------------------------------------------------------------------"

# Genera la variable con la ruta actual a partir de la variable ${PWD}
WD=${PWD}

# Recorre el fichero para ejecutar el mantenimiento por cada fila
# Omite las lineas del fichero dat que tienen comentarios "#"
# Omite las lineas vacias grep . (devuelve las lineas que tienen algun caracter)
cat ${CONFIG} | grep -v "#" | grep . | while read RUTA DIAS TIPO_BORRADO
do
   #En las rutas dependientes del entorno sustituye la cadena de texto recuperada del fichero por el valor de la variable
   f_tee "BORRADO de ${RUTA} ${DIAS} ${TIPO_BORRADO}" 
    if [ -d ${RUTA} ];
    then 

    # Dependiendo del tipo de borrado ejecuta su borrado correspondiente
  case ${TIPO_BORRADO} in
            "FICH") # Borra los ficheros de la ruta indicada, no borra en subcarpetas
                    f_tee "... Borrado de los ficheros de la ruta indicada, no borra en subcarpetas"
                    # Para que encuentre únicamente los ficheros es necesario hacer el find con .
                    # se hace un cd y si no se producen errores realiza el find y el rm
                    # Busca y borra los ficheros con antigüedad superior a DIAS solo de la carpeta indicada
                    # Linea de pruebas cd ${RUTA} &&  find .  \( ! -name . -prune \) -type f 
                    cd ${RUTA} &&  find .  \( ! -name . -prune \) -type f -mtime +${DIAS} -exec rm -f {} \; 2>> ${LOG_FILE}
 cd ${WD}
          ;;
         "ALL") # Borra todo el contenido de la carpeta y directorios
                    f_tee "... Borrado de todo el contenido de la carpeta" 
 # Se hace en dos pasos para eliminar primero los ficheros y así que no falle por demasiados
 # Argumentos lo segundo.
                    # Busca y borra los ficheros con antigüedad superior a DIAS de la carpeta indicada y sus subcarpetas
                    find ${RUTA} -type f -mtime +${DIAS} -exec rm -f {} \; 2>> ${LOG_FILE}
                    # El /* es para que no intente borrar la propia ruta que se le indica
 # Borra todos los ficheros y directorios contenidos en ruta con
 # antigüedad superior a DIAS 
 find ${RUTA}/* -type d -mtime +${DIAS} -exec rm -rf {} \; 2>> ${LOG_FILE} 
             ;;
            "ALLFICH") # Borra los ficheros de la ruta indicada y de todas sus subcarpetas
                    f_tee "... Borrado de los ficheros de la ruta indicada y de todas sus subcarpetas"
                    # Busca y borra los ficheros con antigüedad superior a DIAS de la carpeta indicada y sus subcarpetas
                    find ${RUTA} -type f -mtime +${DIAS} -exec rm -f {} \; 2>> ${LOG_FILE}
         ;;
         *) #Tipo de borrado no valido 
                    f_tee "Tipo de borrado no valido"
                    f_control 2 "${RUTA} ${DIAS} ${TIPO_BORRADO}"
            ;;
         esac
      else
 # Si la ruta no existe genera un error
 f_control 4 "${RUTA} ${DIAS} ${TIPO_BORRADO}"
      fi
done

echo
f_tee "----------------------------------------------------------------------"
f_tee "Proceso finalizado "
f_tee "LOG: <${LOG_FILE}>"
f_tee "----------------------------------------------------------------------"
echo

Otro poco de código Windows

Ahora un poco de código de Windows, este tipo de mantenimiento es mediante un combo de scripts (vbs + bat). El script permite borrar los ficheros antiguos en función a una carpeta y días dados pasados por argumento
Si os fijáis las variables vienen en francés de una temporada que pasé trabajando en París. Primero el script vbs que permite borrar ficheros.

'Fichero: purge_fichiers.vbs
'-----------------------------
'recuperacion de parametros
Dim oArgs
Set oArgs=WScript.arguments
Dim folder
Dim jours
folder=(oArgs(0))
jours=(oArgs(1))
 
Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = +folder
strJours = CInt(+jours)
 
Set objFolder = objFS.GetFolder(strFolder)
For Each strFile In objFolder.Files
    If DateDiff("d",strFile.DateLastModified,Now) > +strJours Then
        strFileName = strFile.Name
        'WScript.Echo +folder & "\" & +strFileName
        objFS.DeleteFile(+folder & "\" & +strFileName)
    End If
Next
 Ahora el script .bat: purge.bat que indica borrar en unas carpetas indicadas dejando los 90 días, unas carpetas que además son "rutas de red" perfectamente podrían ser locales del equipo.
@echo off
REM -----------------------------------------------------------------------------------
REM  VERSION  |    QUAND    | PROJET      |                  COMMENTAIRE              |
REM -----------------------------------------------------------------------------------
REM   1.0     | 20/03/2014  | TMA         | CREATION DU SCRIPT Javier Blanco Romero   |
REM           |             |             |                                           |
REM -----------------------------------------------------------------------------------
SET MYDIRECTORY=\\ADNENT15258\Applis\ADNENT\batch_user\
SET LOGDIRECTORY=\\ADNENT15258\Transferts\ADNENT\log\
SET RECEIVEFILEDIRECTORY=\\ADNENT15258\Transferts\ADNENT\USER\
SET SENDFILEDIRECTORY=\\ADNENT15258\Transferts\ADNENT\USER\fichiers_envoyes\
 
 
cscript /nologo %MYDIRECTORY%purge.vbs %RECEIVEFILEDIRECTORY% 90
cscript /nologo %MYDIRECTORY%purge.vbs %LOGDIRECTORY% 90
cscript /nologo %MYDIRECTORY%purge.vbs %SENDFILEDIRECTORY% 90

Lo principal y/o primordial en este caso para windows es que no hay que instalar ninguna herramienta, aplicación de terceros para hacer correr un vbs y un bat. Fácil y efectivo. Estas tareas Unix, Windows las podríamos programar para no tenerlas que ejecutar a mano.

0 comentarios: