Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Comprobar Cambios En Los Archivos De Un Directorio
Hola!.
Si tuvierais que comprobar que se han producido cambios en un conjunto de archivos. ¿ Qué método usaríais ?.
Por ejemplo, tengo una carpeta con los proyectos de gambas del mes de enero 2016.
¿ Cómo sabrías los archivos que se han modificado desde el ultimo control que hiciste hace una semana ?.
Lo que se me ha ocurrido es usar el comando md5sum y crear un archivo donde se van añadiendo cada una las
suma de verificación de los archivos que componen un directorio.
El código de ejemplo es este:
- Primero creamos el archivo de firmas. Naturalmente una vez creado, debemos luego comentar esa linea.
- Almacenar el archivo de firmas en una cadena
- Comprobamos los cambios
'Ojo. Debe cambiarse la ruta del directorio a uno que tengas tú. ;-)
Private Const rutadirectorio As String = "/home/jack/Prueba/Programacion/PracticasGambas/Enero2016/"
Private Const nomcheck As String = "checksum.md5"
Private lista As String
Public Sub Main()
'Una vez creado el archivo de comprobación, esta línea debe comentarse para comprobar el efecto
CrearFirma(rutadirectorio)
lista = ComprobarFirma(rutadirectorio, nomcheck)
BuscarCambios(lista)
End
Public Sub CrearFirma(ruta As String)
Dim arch As String
Dim tmp As String
Dim lst As String
lst = ""
For Each arch In RDir(ruta, Null, gb.File).Sort()
Exec ["md5sum", rutadirectorio &/ arch] To tmp
lst &= tmp
Next
File.Save(rutadirectorio &/ nomcheck, lst)
End
Public Function ComprobarFirma(rutacomprobar As String, archivocheck As String) As String
Dim lsttmp As String
Exec ["md5sum", "--check", rutacomprobar &/ archivocheck] To lsttmp
Return lsttmp
End
Public Sub BuscarCambios(lst As String)
Dim linea As String
For Each linea In Split(lst, gb.NewLine)
If InStr(linea, "La suma no coincide") Then Print linea
Next
End
Supongamos que estamos trabajando con este mismo proyecto. Al grabar se crean cambios en el proyecto.
La salida den la consola fue:
Citar:
home/jack/Prueba/Programacion/PracticasGambas/Enero2016/ControlDeCambios/.gambas/MAIN: La suma no coincide
/home/jack/Prueba/Programacion/PracticasGambas/Enero2016/ControlDeCambios/.settings: La suma no coincide
/home/jack/Prueba/Programacion/PracticasGambas/Enero2016/ControlDeCambios/.src/Main.module: La suma no coincide
/home/jack/Prueba/Programacion/PracticasGambas/Enero2016/ControlDeCambios/.src/Main.module~: La suma no coincide
Claro que si usamos gb.settings no tendría que eliminar la linea de creación de firmas, una bandera se encargaría de eso
al comienzo.
Como dije es solo un ejemplo, el proceso de control de toda una unidad es largoooo.
Y seguro que hay métodos mejores.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Miercoles, 13 Enero 2016, 21:24; editado 1 vez
|
#1 Miercoles, 13 Enero 2016, 20:33 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
He modificado el código, ya que la creación de las firmas no funcionaba. Se necesitaba la variable lst.
Y he ahorrado la creación de otro array.
Esta vez os subo el código para que lo probéis, si queréis.
Como es normal todo esto hecho con formularios queda mejor. Pero las pruebas son las pruebas.
En realidad estuve probando con shell scripts y me lleve toda la mañana para descubrir que nunca se encuentra toda
la información que quieres, horas perdidas buscando entre pdfs, horas perdidas entre páginas webs..
Respuesta..."Suele pasar". ejem..
Crear archivo de verificación por cada archivo.
No sabía como quitar la extensión al nombre del archivo y añadirle md5.
Por otro lado cut estaba trabajando con el interior del archivo, no con un nombre.
Con echo pude hacerlo.
#!/bin/bash
for i in $(ls -1);
do
n=$(echo $i | cut -d "." -f1)
md5sum $i > $n.md5
done
De un directorio, crear un solo archivo de verificación de un conjunto de archivos.
#!/bin/bash
for i in $(ls -1);
do
md5sum $i >> comprueba.md5
done
Que en una linea también se puede hacer.
Saludos
Descripción: |
|
Descargar |
Nombre del archivo: |
ControlDeCambios.tar.gz |
Tamaño: |
12.51 KB |
Descargado: |
52 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
ControlDeCambios.tar.gz |
Tamaño: |
12.51 KB |
Descargado: |
52 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
ControlDeCambios.tar.gz |
Tamaño: |
12.51 KB |
Descargado: |
52 veces |
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#2 Miercoles, 13 Enero 2016, 21:35 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
...porque non usaste la propiedad:
|
#3 Miercoles, 13 Enero 2016, 23:23 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
...porque non usaste la propiedad:
Si. Tendría que ver eso. Aunque no sé si eso realmente es lo más eficiente.
¿ Y si se pudieran manipular las fechas de los archivos ?.
Recuerdo el truco que para ciertas protecciones , la gente cambiaba la fecha del sistema.
Te cuento. Cuando usaba el antivirus McAfee en los tiempos del Msdos, El antivirus creaba en cada directorio un archivo
de control para saber si se habían modificado algún archivo. Incluso cortafuegos como el Outpost en Windows, cuando se modifica
un archivo (por ejemplo en una actualización) te avisa de que se va a modificar, solicitándote permiso.
Creo que estos programas trabajaran con algo más serio que una fecha, ¿ o no ?.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Jueves, 14 Enero 2016, 00:35 |
|
|
codificador
Analista Programador
Registrado: Junio 2010
Mensajes: 420
Edad: 114 Ubicación:
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
Como dije es solo un ejemplo, el proceso de control de toda una unidad es largoooo.
Y seguro que hay métodos mejores.
Saludos
es mas rapido usar crc32 que md5
de hecho lo que esta haciedo ya existe con crc32
http://linux.die.net/man/1/cksfv
|
#5 Jueves, 14 Enero 2016, 05:49 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
Citar:
... Aunque no sé si eso realmente es lo más eficiente.
¿ Y si se pudieran manipular las fechas de los archivos ?.
Eficiente no quiere decir manazas-proofs. Si queremos evitar que alguien modifique algo hay otros sistemas si lo que se trata es de saber si se ha modificado algo (para hacer copias de seguridad o algo así), con la fecha debería bastar.
La experiencia dice que para todo este tipo de operaciones con ficheros y demás, lo mejor es utilizar las herramientas del SO, que suelen estar muy probadas y ser muy avanzadas a veces.
Se me ocurre una primera aproximación:
1.- La primera vez creamos un fichero (f1) con el listado de todos los archivos ordenados por fechas:
ls -lt * > f1
2.- Las demás veces hacemos lo mismo en f2, comparamos con f1 dejando el resultado en diferencias.txt y establecemos f2 como f1.
ls -lt * > f2
sdiff -s f1 f2 >diferencias.txt
rm f1
mv f2 f1
3.- Procesamos el contenido de diferencias.txt con gambas o con lo que sea para hacer lo que queramos con los modificados.
Todo esto puede ir a un shell script o ser tratado desde gambas vía exec o shell. Dejando a parte la eficiencia de nuestra manera de procesar diferencias.txt creo que sería algo muy rápido.
Saludos.
=================== No podemos regresar
|
#6 Jueves, 14 Enero 2016, 08:05 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
codificador:
No conocía crc32
Shordi:
Aunque la forma de hacerlo parece sencillo, el proceso de comparación puede que sea mas lento.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#7 Jueves, 14 Enero 2016, 11:25 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
Citar:
Aunque la forma de hacerlo parece sencillo, el proceso de comparación puede que sea mas lento.
No creo, por complejo que lo hagas (y en principio con el nombre te vale) ten en cuenta que solo procesarás los archivos modificados, es decir un archivo de texto que contiene una línea por cada archivo modificado, por lo que no debe tardar mucho, que digamos.
=================== No podemos regresar
|
#8 Jueves, 14 Enero 2016, 12:59 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
Si. Tendría que ver eso. Aunque no sé si eso realmente es lo más eficiente.
Porque no seria eficiente ?
¿ Y si se pudieran manipular las fechas de los archivos ?
Tienes que cambiar las fechas de los archivos ?
|
#9 Jueves, 14 Enero 2016, 15:08 |
|
|
codificador
Analista Programador
Registrado: Junio 2010
Mensajes: 420
Edad: 114 Ubicación:
|
Re: Comprobar Cambios En Los Archivos De Un Directorio
codificador:
No conocía crc32.............
noooo lo conocias.... espero que no hayas estudiado informatica
pero si no te gusto cksfv que ya hace todo
sigue inventando la rueda
|
#10 Jueves, 14 Enero 2016, 15:48 |
|
|
|