Script Bash: copiar imágenes nuevas de SD a la PC

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.

Tengo que usar la tarjeta porque no puedo transferir directamente las imágenes de la cámara vía USB, ya que no existen drivers para Linux (como siempre ocurre… )

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.

No puse licencia porque no me he informado bien acerca de cada versión de GPL, pero están en libertad de copiarlo y modificarlo. Y no duden en decir cómo podría mejorase o si hay otras maneras de hacer lo mismo, pero más fácil.

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

      Percaff_TI99 dijo

    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!!!

         Joaquin dijo

      Listo, agregado en http://paste.desdelinux.net/4737
      Gracias!

      vr_rv dijo

    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

         Joaquin dijo

      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 🙂

      Manuti dijo

    Y no conocéis Rapid Photo Downloader? Creo que hace todo eso y más.

         Mr Black dijo

      La cuestion es que el flaco lo hizo el mismo, se habra divertido supongo y le puede servir a alguien mas

         Joaquin dijo

      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)

      codelab dijo

    Parece útil, me lo guardo por si algún día lo necesito. Gracias.

         Joaquin dijo

      Gracias!

      nonamed dijo

    pero para eso ya tenemos grsync

         Joaquin dijo

      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.

      lastnewbie dijo

    Wow, me parece muy interesante el código, muy útil. sigue así. 😀
    Lo guardaré por si lo llegara a necesitar.

    Saludos.

         Joaquin dijo

      Gracias!.