Algunas veces necesitamos realizar tareas repetitivas en nuestra PC, que con el tiempo se vuelven tediosas. En ciertos casos podemos aliviar nuestro trabajo haciendo uso de scripts que trabajen por nosotros.
Hoy les escribo para mostrarles un script en bash que resolvió una necesidad: copiar imágenes nuevas de mi cámara digital desde una tarjeta SD a la PC.
Situación:
Cada vez que tenía nuevas imágenes para descargar al equipo, realizaba los siguientes pasos:
1. Abrir el directorio donde tengo las imágenes clasificadas en sub-directorios.
2. Crear un nuevo sub-directorio con el nombre de la fecha de ese momento, en formato aa.mm.dd
3. Moverme al sub-directorio creado la vez anterior y ver cuál es la última imagen guardada.
4. Copiar desde la tarjeta SD las imágenes nuevas al directorio recién creado.
Esto no toma más de un minuto, pero es más fácil que el proceso se realice solo al insertar la tarjeta.
Solución:
Crear un script en bash que haga lo siguiente:
1. Verificar al iniciarse si está montada la tarjeta SD. De lo contrario finaliza.
2. Ir al directorio principal de las imágenes y buscar el último. Guardar su nombre en una variable.
3. Comparar la fecha actual con el último directorio, si difieren, crear un nuevo directorio con el nombre de la fecha actual en formato «aa.mm.dd».
4. Moverse al último directorio (no el nuevo, sino otro más antiguo) y guardar en una variable el nombre del último archivo transferido la vez anterior.
En este paso es necesario filtar el nombre del archivo para poder compararlo próximamente con los nuevos archivos de la tarjeta. Los archivos tienen el siguiente formato: xxx_xxxx.eee Donde: x= dígito 0 a 9 y eee= extensión (JPG, MOV). Por ejemplo: 100_5684.JPG, 100_5699.MOV. Luego del filtro, el nombre queda xxxxxxx Por lo tanto, en el ejemplo anterior, tendríamos: 1005684, 1005699.
Ya que el directorio puede contener otros tipos de archivos o con los nombres alterados, es que se usa el filtro.
5. Moverse a la tarjeta y filtrar los archivos como en el punto anterior.
6. Comparar los archivos de la tarjeta con la variable que contiene el último archivo transferido la vez anterior (punto 4) y copiar en el directorio recientemente creado los archivos con nombre mayor al de la variable. (ya que los nombres son sólo números).
7. Abrir con el administrador de archivos el directorio que contiene las nuevas imágenes.
A continuación les muestro el script con comentarios que explican su funcionamiento. Aclaro que no soy programador y me dio varios dolores de cabeza hasta que logré que funcione, especialmente cuando tuve que filrar los nombres para el ciclo «for».
#!/bin/bash ### --- VERIFICAR SI ESTA MONTADO SD --- ### SD=/media/KODAK/DCIM/100Z8612 if [[ -d $SD ]]; then ### --- CREAR DIRECTORIO --- ### #Leer directorio de imágenes y crear otro con el nombre de la fecha #actual y permisos 755 si no existe. cd ~/Imágenes/kodak ULTDIR=`ls -1 | tail -n1` # último directorio de la lista. FECHA=`date +%y.%m.%d` #Fecha actual en formato AA.MM.DD if [ "$ULTDIR" != "$FECHA" ]; then mkdir -vm 755`date +%y.%m.%d`# crear directorio con fecha actual fi ### --- VER ÚLTIMO ARCHIVO DE $ULTDIR --- ### cd $ULTDIR ULTIMG=`ls -1 [0-9][0-9][0-9]_[0-9][0-9][0-9][0-9].[JM][PO][GV] | tail -n1 | cut -c1-3,5-8` # ver la última imagen con nombre xxx_XXXX.eee .eee = extensión de archivo (JPG o MOV) #Para asegurar que es script funcione luego de que se cumpla: # 100_9999.eee --> 101_0000.eee y no haya errores # CORTAR para que quede en formato xxxXXXX ### --- MOVERSE AL ÚLTIMO DIRECTORIO DE LA LISTA --- ### # O AL CREADO RECIENTEMENTE, SI SE CREÓ # cd .. ULTDIR=`ls -1 | tail -n1` # va de nuevo porque sino toma al ULTDIR anterior del if cd /media/KODAK/DCIM/100Z8612 ### --- FILTRAR los archivos en SD --- ### FILTRO=`ls -1 [0-9][0-9][0-9]_[0-9][0-9][0-9][0-9].[JM][PO][GV]` ### --- COMPARAR NUEVOS ARCHIVOS DE NOMBRE MAYOR AL ULTIMG --- ### for I in $FILTRO do N=`echo $I | cut -c1-3,5-8` #Cortar nombre if [[ "$ULTIMG" -lt "$N" ]]; then cp $I ~/Imágenes/kodak/$ULTDIR fi done thunar ~/Imágenes/kodak/$ULTDIR #Abrir el nuevo directorio con Thunar else exit 0 fi exit 0
Finalmente para que funcione, lo agregué a la aplicación «Removable Drives and Media» de Xfce en el menú
Configuración → Administrador de configuración de Xfce 4 → Removable Drives and Media → Cameras
usando la opción de importar imágenes. Cuando inserto la tarjeta, un cuadro de diálogo me pregunta si deseo importar las imágenes. Al aceptar, se ejecuta el script.
Bueno, eso es todo. Perdón por la desprolijidad del texto, es mi primer post y no se cómo tabular el script al editarlo. Espero que le sea útil a alguien por lo menos para tener una idea y adaptarlo a cada caso en particular.
Muy interesante Joaquín, una buena idea es subir el script en el paste donde es mas fácil compartir el código, y como tú dices se puede adaptar a otras necesidades y uno aprende a utilizar bash un poco más.
Saludos!!!
Listo, agregado en http://paste.desdelinux.net/4737
Gracias!
Que al copiar una fotografía que ya esta en el directorio no te indica que ya hay uno y te da la opción de reemplazarlo o no copiar?
De todos modos es muy útil, ya que hace todo de manera automática
Hola. En realidad no copia imágenes repetidas, sólo las ignora. La idea justamente era copiar los archivos nuevos sin necesidad de interacción con el usuario. Además, salvo que agregue imágenes más de una vez al día, el script copia los nuevos archivos a un nuevo directorio. Te explico secillamente:
Hoy es día 10/03/13, creo un directorio llamado 13.03.10 y copio dentro algunas imágenes o video (MOV): 100_4440.JPG, 100_4441.JPG, 100_4442.MOV, 100_4445.JPG
(las 4443 y 4444 que faltan, fueron borradas con la cámara, la última es la 4445).
Luego supongamos que uso el script el día 01/04/13 y tengo nuevas imágenes en la tarjeta. El script crea un directorio llamado 13.04.01 y dentro las nuevas imágenes/videos cuyo nombre sea mayor a «4445»; porque lee el directorio 13.03.10 y la última imágen es la 100_4445.JPG. Si vuelvo a ejecutar el script con nuevas imágenes de la tarjeta ese mismo día, éstas se agregan al directorio 13.04.01. No se sobreescribre ninguna.
Espero haber aclarado un poco mi idea 🙂
Y no conocéis Rapid Photo Downloader? Creo que hace todo eso y más.
La cuestion es que el flaco lo hizo el mismo, se habra divertido supongo y le puede servir a alguien mas
Hola. No lo conocía y parece bueno por lo que vi en internet, pero en realidad el script cumple perfectamente lo que necesito; que es insertar la tarjeta y que se copien todos los archivos automáticamente.
Además me sirvió para aprender un poco más porque obviamente no funcionó a la primera; ocurrieron errores y de ellos se aprende bastante.
No pensaba mostrar el script para solucionarle los problemas a otros, hay aplicaciones como las que mencionas que son más generales. Lo compartí para que lo lean y como referencia para crear cosas nuevas haciendo uso de los bucles (en este caso «for») y la expresiones regulares (variables «ULTIMG» y «FILTRO» en el script)
Parece útil, me lo guardo por si algún día lo necesito. Gracias.
Gracias!
pero para eso ya tenemos grsync
Sí, pero creo que a rsync lo usan más para backups. Nunca lo he mirado pero es una aplicación que deberíamos tener en cuenta y aprender ausarla todos.
No sabía que existía una interfaz gráfica para rsync.
Wow, me parece muy interesante el código, muy útil. sigue así. 😀
Lo guardaré por si lo llegara a necesitar.
Saludos.
Gracias!.