tools inotifywait extension bash inotify

bash - inotifywait - inotify-tools



inotificar y golpear (3)

Citando la página man de inotifywait:

inotifywait will output diagnostic information on standard error and event information on standard output. The event output can be configured, but by default it consists of lines of the following form: watched_filename EVENT_NAMES event_filename watched_filename is the name of the file on which the event occurred. If the file is a directory, a trailing slash is output.

En otras palabras, imprime los nombres de los archivos a la salida estándar. Por lo tanto, debe leerlos desde la salida estándar y operarlos para hacer lo que quiera hacer.

Estoy tratando de hacer un script de bash con inotify-tools que monitoree un directorio y altere todos los archivos nuevos eliminando las líneas que contienen "EE". Una vez modificado, moverá los archivos a otro directorio.

#!/bin/sh while inotifywait -e create /home/inventory/initcsv; do sed ''/^/"EE/d'' Filein > fileout #how to capture File name? mv fileout /home/inventory/csvstorage fi done

¿Por favor ayuda?


De forma predeterminada, la salida de texto de inotifywait -e CREATE es de forma

watched_filename CREATE event_filename

donde watched_filename representa /home/inventory/initcsv y event_filename representa el nombre del nuevo archivo.

Entonces, en lugar de tu while inotifywait -e ... line, pon:

DIR=/home/inventory/initcsv while RES=$(inotifywait -e create $DIR); do F=${RES#?*CREATE }

y en su línea sed use $F como el nombre Filein . Tenga en cuenta que la construcción $(...) es una forma de sustitución de proceso compatible con posix (a menudo se realiza con backticks) y el resultado de ${RES#pattern} es igual a $RES con el prefijo de coincidencia de patrón más corto eliminado. Tenga en cuenta, el último carácter del patrón es un espacio en blanco. [Ver actualización 2]

Actualización 1 Para manejar nombres de archivos que pueden contener espacios en blanco, en la línea sed use "$F" lugar de $F Es decir, use comillas dobles alrededor de la referencia al valor de F

Las definiciones RES=... y F=... no necesitan usar comillas dobles, pero está bien usarlas si lo desea; por ejemplo: F=${RES#?*CREATE } y F="${RES#?*CREATE }" ambos funcionarán bien cuando se manejen nombres de archivos que contengan espacios en blanco.

Actualización 2 Como se señaló en el comentario de Daan, inotifywait tiene un parámetro --format que controla la forma de su salida. Con comando

while RES=$(inotifywait -e create $DIR --format %f .) do echo RES is $RES at `date`; done

corriendo en una terminal y comando

touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa

ejecutándose en otro terminal, la siguiente salida apareció en el primer terminal:

Setting up watches. Watches established. RES is a at Tue Dec 31 11:37:20 MST 2013 Setting up watches. Watches established. RES is aaa at Tue Dec 31 11:37:21 MST 2013 Setting up watches. Watches established. RES is aaaa at Tue Dec 31 11:37:22 MST 2013 Setting up watches. Watches established.


La salida de inotifywait es de la forma:

filename eventlist [eventfilename]

Si los nombres de sus archivos pueden contener espacios y comas, esto resulta difícil de analizar. Si solo contiene nombres de archivo ''sanos'', entonces puedes hacer:

srcdir=/home/inventory/initcsv tgtdir=/home/inventory/csvstorage inotifywait -m -e create "$directory" | while read filename eventlist eventfile do sed ''/^"EE/d''/'' "$srcdir/$eventfile" > "$tgtdir/$eventfile" && rm -f "$srcdir/$eventfile done