# [inotify] - Ideas sencillas/scripts

## i92guboj

Hoy estaba aburrido y he estado leyendo la documentación de inotify-tools. Para los despistados, inotify es el sistema de notificación de eventos a nivel de sistema de archivos de las nuevas versiones (bueno, no tan nuevas ya  :Razz:  ) del kernel de linux. Es tan ligero en recursos que incluso se puede utilizar para monitorizar cambios en tu sistema de archivos en scripts de bash, python y similares.

El propósito de inotify-tools es el de proporcionar los mecanismos básicos para acceder a inotify desde tierra de usuario, lo cual podemos aprovechar en combinación con nuestro shell favorito para conseguir algunas cosillas.

La idea de este hilo, si la gente se lanza, es que todos aporten y digan las cosas que se les ocurran (bien con código o bien con ideas sencillas que a lo mejor pueden ser interesantes para otros que tengan las capacidades para plasmarlas en forma de script).

Y para poner el primer ladrillo, aquí dejo un pequeño ejemplo.

```

#!/bin/bash

#

# Presenta un popup cada vez que un archivo es creado en la

# carpeta $P2PDIR.

#

# Este script se puede lanzar al iniciar tu WM o DE favorito,

# de esta forma recibirás una notificación en un diálogo cada

# vez que llegue un nuevo archivo a tu carpeta de descargas.

#

# Es responsabilidad tuya matar al script (o más bien configurar

# tu WM para que lo haga, al salir de las X, de lo contrario, se

# abrirá de nuevo la próxima vez que entres en X, y recibirás

# los avisos por duplicado. En fvwm basta con añadirlo a

# StartFunction y matarlo en ExitFunction.

exec inotifywait -mrq --excludei .*\.tmp --format "%f" --event create --event move $[p2pdir] | \

  while read newfile

  do

    (notify-send --expire-time=30000 \

      --icon=/usr/share/icons/hicolor/32x32/apps/kmldonkey.png \

      "Nuevo archivo recibido:" "$newfile"&)

  done

```

XMessage se puede sustituir por lo que se quiera, por supuesto. Es solo un ejemplo. Lo interesante de esto es que no es necesario tener kmldonkey o amule cargados con su iconito en la bandeja de sistema (yo no uso bandeja de sistema de todas formas). Eso nos ahorra unos pocos megas de memoria de paso. Los que tengan mldonkey configurado como daemon al arrancar lo encontrarán particularmente útil.

Ahí queda eso. Si la gente se anima con nuevas ideas podemos hacer un hilo interesante. Si no, pues nada, lo dejamos morir silenciosamente y ya está.

PD: Ni que decir tiene que es necesario emerger inotify-tools para que esto ande, así como tener las opciones correspondientes marcardas en el kernel, que son estas:

```

$ grep INOTI /home/i92guboj/kernel/linux/.config

CONFIG_INOTIFY=y

CONFIG_INOTIFY_USER=y

```

EDIT: Retoque: añadido "--excludei .*\.tmp"  :Wink: 

EDIT: Cambiado evento "create" por "close_write", y luego por "move". Parece que "move" anda bien para el propósito.  :Wink: 

EDIT: Revisión final, ya funciona perfecto, creo.Last edited by i92guboj on Sun Dec 30, 2007 9:16 pm; edited 3 times in total

----------

## ekz

Genial idea, ojalá se me ocurra algo luego, pero por ahora quería añadir lo siguiente:

Cambiar lo de XMessage como dice i92 por 

```
notify-send "Nuevo fichero" "$(date) -- El archivo \"$newfile\" acaba de llegar."
```

Eso hará que aparezca una notificación similar a las que aparecen para retirar un pendrive con seguridad.

Testeado en Xfce, requiere el paquete x11-libs/libnotify instalado.

Saludos

----------

## i92guboj

Gracias por el truco. ¿No habrá una forma de regular la posición en la que aparece la notificación, verdad?   :Laughing: 

----------

## Howlett

Me parece muy buena idea.

Cuando lo leí se me ocurrió la misma modificación que ha expuesto ya ekz. Así sale un Pop-up menu de esos tan majos. En Gnome también funciona.

Por cierto, para los usuarios de KDE, creo que se puede usar kdialog:

```
kdialog -msgbox Hola Mundo
```

Lo he visto por ahí así que no estoy muy seguro ya que no uso KDE.

----------

## i92guboj

Para un popup amarillo de esos cutres que gasta kde sería algo como 

```

kdialog --passivepopup "foo" 5

```

Aunque los de arriba me gustan más. Con --msgbox saldría una ventana estilo xmessage.

Sobre esto hay montones de opciones, también podemos usar xosd, si preferimos las soluciones menos intrusivas, además, así podemos controlar la posición en pantalla  :Wink: 

----------

## Howlett

 *i92guboj wrote:*   

> Gracias por el truco. ¿No habrá una forma de regular la posición en la que aparece la notificación, verdad?  

 

Pues al parecer sí.

Hay que usar el editor de configuración de Gnome, el gconf-editor, e ir a:

```
/apps/notification-daemon/
```

En el campo popup-location se mete la posición deseada, aunque sólo deja las cuatro esquinas de la pantalla: "top_left","top_right","bottom_left" y "bottom_right"

----------

## gringo

interesante hilo  :Very Happy: 

Lo único que estoy usando en relación con inotify es iwatch, un pequeño script que sirve para monitorizar en tiempo real un sistema de archivos, ideal para monitorizar un servidor web o ftp p.ej. 

Ebuilds aqui  :Wink: 

saluetes

----------

## Coghan

Una idea interesante sería:

Monitorizar el directorio /media para ver que dispositivos extraibles se montan. Sería interesante para saber quien te intenta robar la fotos cuando no miras   :Evil or Very Mad: 

Usando de base el script de i92guboj se me ocurre algo como esto (no lo he probado aún, no soy experto en bash, solo aporto ideas) :

```
#!/bin/bash

#

exec inotifywait -mrq --excludei .*\.tmp --format "%f" --event create --event move /media | \

  while read newfile

  do

    (notify-send --expire-time=30000 \

      "Está siendo monitorizado el acceso al dispositivo extraible:" "$newfile"&);

    (echo ${newfile} | mail "user@domain.com" -a "From: root@$(uname -n)" \ 

       -s "Fichero usados en dispositivos extraibles en $(uname -n)"&)

  done
```

El script podría tener/añadir:

Que archivos y/o directorios se copian/mueven/modifican desde y hacia este dispositivo.

Que identifique la ruta completa recursivamente.

Que identifique la fecha/hora de acceso y el usuario que accede.

Que envíe un mail con los resultados cada 12 o 24 horas.

Que avise con un popup al usuario de que está siendo monitorizado (Hay que respetar la legalidad)

Con inotifywatch se podría buscar la forma de aglutinar todos los movimientos de un día o franja de tiempo en un solo mensaje

----------

## aj2r

Por si no lo habíais visto ya, os pongo aquí un enlace a las especificaciones de notificación de escritorio (Desktop Notification Specification), espero que os sirvan. Entre otras cosas podréis encontrar los hints disponibles para notify-send y así poder personalizar la posición del mensaje entre otras cosas.

http://www.galago-project.org/specs/notification/index.php

----------

## ekz

De vuelta de unos días de playa, y pasando un par de fotos tomadas con mi móvil hacia mi PC, me acordé de este hilo:

Resulta que mi nokia 5070 tiene poca memoria, por eso adquirí un infrarrojo-usb para tenerlo siempre con memoria disponible. Las fotos son nombradas como Imagen000.jpg, Imagen001.jpg, Imagen002.jpg y así sucesivamente. por lo que el problema viene al tomar nuevas fotos y moverlas al directorio correspondiente, ya que las nuevas imágenes intentarán sobreescribir las anteriores  :Confused: 

Así que trataré de idear un script que renombre los ficheros (a algo mejor como la fecha y hora) al momento de ser ingresados a este directorio. Cualquier ayuda bienvenida será  :Smile: 

Saludos

---- 

EDIT: Ya lo tengo, estoy refinando unos detalles y lo adjunto aquí

----

```
#!/bin/bash 

FOTOS=~/img/fotos

cd $FOTOS

exec inotifywait -mq --excludei .*\.tmp --format "%f"  --event create $FOTOS | \

  while read newfile

  do

     mv $newfile ekz-$(date +%Y%m%d%H%M%S).jpg 

     (notify-send --expire-time=5000 \

      --icon=/usr/share/icons/Tango/32x32/actions/go-next.png \

      "Foto renombrada" "    $newfile"&)

  done 
```

Hay algunos detalles que no supe resolver!!

* Al dejarlo en "create" sólo funciona cuando las imágenes se copian al directorio, pero si lo cambio a "move" sólo funciona cuando las imágenes se mueven al directorio. Peor resulta si lo dejo con ambas opciones, ya que como estoy usando el comando mv para renombrar el fichero se produce un bucle infinito   :Razz: 

* No funciona con 2 o más archivos a la vez   :Confused: 

Bueno por el momento lo usaré, ya que sólo quería que no se sobre-escribieran las fotos, la fecha en que la muevo al directorio las mantendrá ordenadas, supongo que con una cámara digital y los datos EXIF sería mucho mejor organizarlas

Saludos

----------

## achaw

El unico problema que le veo al primer script (Esto hablando a lo burro, porque no lo probe todavia) es que tambien lanzaria una notificacion cuando se saca un fichero del directorio p2pdir. O sea, si nos llega un archivo a nuestro dir de descargas, y lo queremos mover a nuestro dir de videos (por ejemplo) tambien nos lanzaria la notificacion. Me intereso esto  :Smile: 

Lo pruebo y veo.

Saludos

EDITO

------------

Verificado, y es como hago notar arriba. Lo que hay que hacer es cambiar "move" por "moved_to" y ahi si, solo notifica el ingreso al directorio, y no la salida

----------

## Coghan

 *ekz wrote:*   

> Hay algunos detalles que no supe resolver!!
> 
> * Al dejarlo en "create" sólo funciona cuando las imágenes se copian al directorio, pero si lo cambio a "move" sólo funciona cuando las imágenes se mueven al directorio. Peor resulta si lo dejo con ambas opciones, ya que como estoy usando el comando mv para renombrar el fichero se produce un bucle infinito  
> 
> * No funciona con 2 o más archivos a la vez  
> ...

 

Me he tomado la libertad de modificar un pelín tu script, pero creo que te resuelve el problema que comentas al mover y el de solo una foto a la vez.

```
#!/bin/bash

FOTOS=~/img/fotos

EKZ=ekz

num="1"

cd $FOTOS

exec inotifywait -mq --excludei .*\.tmp --excludei $EKZ --format "%f"  --event move $FOTOS | \

  while read newfile

  do

     EKZ=ekz-$(date +%Y%m%d%H%M%S)-$num.jpg

     num=$(($num + 1))

     mv $newfile $EKZ

     (notify-send --expire-time=5000 \

      --icon=/usr/share/icons/Tango/32x32/actions/go-next.png \

      "Foto renombrada" "    $newfile"&)

  done
```

----------

## kropotkin

solo como idea, se que se puede hacer, y tal vez no tiene que ver mucho con inotify es que al copiar las fotos, en vez de poner la fecha en al cual estas pasando las fotos del celular/camara al pc, leas los datos EXIF y de nombre le pongas la fecha y hora en la cual fue capturada la imagen.

un ejemplo como para obtener el la fecha de una foto cualquiera.

```

kropotkinix@cesar ~ $ exiftool -dateTimeOriginal 100_0766.JPG

Date/Time Original              : 2007:12:31 22:02:20

```

podrías tomar la fecha y después meterla en una variable para escribir el nombre del archivo haciendo algo como

```

exiftool -dateTimeOriginal 100_0766.JPG | awk '{print $4"_"$5"jpg"}' | sed 's/:/-/g'

```

Saludos.

----------

## demostenes

ekz, lo que necesitas para renombrar "adecuadamente" fotos es:

```

jhead -n%Y%m%d-%H:%M:%S *.jpg

```

Obviamente tendrás que 

```

emerge  media-gfx/jhead

```

Saludos.

----------

## ekz

Gracias por las respuestas, pero este modelo (ni idea de los demás) no agrega datos EXIF a las fotos tomadas   :Sad: 

Pero el script está ahí y solo sería cosa de sustituir esa linea por la que tu comentas 

----

 :Shocked:  Veo que mejoraron el mío a probarlo de inmediato   :Very Happy: 

----

Perfecta idea  :Exclamation:  Gracias, funciona perfecto, sólo tube que cambiar 2 cosas: EKZ=ekz a EKZ=ekz-  porque si no excluía todo mi home (/home/ekz)   :Razz:    y lo del moved_to que comenta achaw

Gracias a todos 

Saludos

----------

