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