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.