Shell Bash en el concepto de PC de Ubuntu

Cómo realizar una tarea cuando se agrega un nuevo archivo a un directorio en Linux

Fatmawati Achmad Zaenuri / Shutterstock.com

Este tutorial le mostrará cómo usar los eventos del sistema de archivos de Linux (notificar) para recibir una notificación cada vez que aparezca un archivo en un directorio. Puede usarlos como activadores para automatizar tareas comunes en su sistema.

Vamos a escribir un script que monitorea un directorio y actúa sobre los archivos nuevos que se agregan. Cada archivo se comprime y se mueve a otro directorio tan pronto como se detecta. El script usa el subsistema inotify, a través de una utilidad llamada inotify-tools. Pero primero, instalemos la herramienta y experimentemos.

Instalar inotify-tools y gzip

Usar apt-get para instalar este paquete en su sistema si está utilizando Ubuntu u otra distribución basada en Debian. En otras distribuciones de Linux, utilice la herramienta de administración de paquetes de su distribución de Linux.

sudo apt-get install inotify-tools gzip

Experimente con inotify-tools

Comencemos mirando un directorio y veamos qué eventos se activan cuando llegan nuevos archivos. Usaremos una herramienta llamada inotifywatch , que forma parte de inotify-tools. Cree un nuevo directorio llamado «entrante»:

mkdir incoming

Comience a buscar en este directorio ejecutando el siguiente comando:

inotifywatch -v incoming

Esto le indicará a inotify que monitoree todos los eventos del sistema de archivos en el directorio «entrante». los -v La opción permite que la herramienta imprima información adicional sobre lo que hace. No especificamos una opción de tiempo de espera (-t ), y el comando continuará recopilando eventos hasta que salgamos con CTRL + C. En este punto, nuestra terminal debería verse así:

Abra una nueva ventana de terminal (o pestaña) y navegue hasta el directorio entrante. Utilice el comando táctil para crear un nuevo archivo llamado «newfile».

cd incoming/
touch newfile

Ahora regrese a la primera ventana de terminal y detenga inotifywatch presionando CTRL + C.

Se pasará una tabla de eventos a la consola, indicando una instancia de «crear», «abrir», «attrib» y «close_write». Estos cuatro eventos ocurrieron cuando usamos la función táctil para crear un nuevo archivo, establecimos sus atributos de acceso al archivo, lo abrimos para escribir un carácter nulo al final y luego lo cerramos. Estos son solo algunos de los muchos eventos que se pueden monitorear en un sistema de archivos con inotify-tools. Puede ver la lista completa en la página principal de inotifywatch.

Para nuestros propósitos, solo estamos interesados ​​en dos eventos:

  • «crear»: cuando se crea un archivo en el directorio de destino.
  • «moved_to»: cuando un archivo se mueve desde otra ubicación al directorio de destino.

Intentemos inotifywatch nuevamente, pero esta vez pidiéndole que monitoree solo estos dos eventos. Ejecute este comando en la primera ventana de terminal:

inotifywatch -v -e create -e moved_to incoming

En la segunda ventana o pestaña de la terminal, intentemos crear un nuevo archivo, editar su contenido y luego mover el archivo desde otra ubicación al directorio de destino. Todos estos comandos se ejecutan desde el directorio de inicio.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Regrese a la primera ventana de terminal y detenga inotifywatch presionando CTRL + C. Veremos el siguiente resultado:

Solo se contaron dos eventos: la creación de un archivo llamado «created.txt» y el movimiento de un archivo existente llamado «created2.txt». Todo lo demás, como modificar «created.txt», fue ignorado.

Mira un directorio y realiza una tarea

Ahora que sabemos qué eventos rastrear, podemos usar otra herramienta llamada inotifywait para bloquear la ejecución hasta que se cree un archivo o se mueva a nuestro directorio de destino. Usaremos los mismos argumentos que con inotifywatch y también especificaremos cómo queremos que se formatee el nombre del archivo para usarlo en nuestra tarea.

Antes de comenzar, necesitamos un directorio para contener los archivos que ya se han procesado. Cree un directorio llamado «procesado»:

mkdir processed

Luego, cree un nuevo script llamado «watch-incoming.sh» y agregue el contenido que se indica a continuación:

#!/bin/bash

TARGET=~/incoming/
PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET 
        | while read FILENAME
                do
                        echo Detected $FILENAME, moving and zipping
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

El script ejecuta el inotifywait orden con el -m opción. Esto hace que el monitor de comandos cambie indefinidamente. Siempre que se detecta un nuevo evento, el nombre del archivo se pasa al comando de lectura y se inyecta en la variable «FILENAME». Se ejecuta el bloque debajo del ciclo while, donde el archivo se mueve primero al directorio «procesado» y luego se comprime. El archivo original se reemplaza con el archivo comprimido y el nombre del archivo terminará con «.gz».

Concedamos permisos de ejecución a este script y ejecútelo desde nuestro directorio de inicio.

chmod u+x watch-incoming.sh
./watch-incoming.sh

Abra la segunda ventana de terminal y cree un nuevo archivo en el directorio «entrante». Enumere el contenido de los directorios «entrante» y «procesado» para ver los resultados del evento detectado:

El archivo de texto sin formato que copiamos al directorio «entrante» fue detectado por el script, copiado a «procesado» y luego comprimido usando gzip.

Podemos hacer algunas cosas interesantes ahora que podemos monitorear la llegada de nuevos archivos a un directorio. Por ejemplo, podríamos agregar marcas de agua a los archivos de imagen, comprimir videos sin procesar a formato mp4 e incluso cargar cada archivo nuevo que vemos en un bucket de Amazon S3. Este script es un buen punto de partida para implementar sus propios flujos de trabajo y automatizar tareas comunes en su sistema.

Deja un comentario

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

Experto Geek - Tu Guía en Tendencias Tecnológicas