¿Cómo detectar nuevos archivos en una carpeta con un script bash ? Me gustaría procesar los archivos tan pronto como se creen en la carpeta. ¿Es posible hacerlo o tengo que programar un script con cron que busque nuevos archivos cada minuto más o menos?
shell
filesystems
files
directory
monitoring
ihatetoregister
fuente
fuente
Respuestas:
Debería considerar usar
inotifywait
, como ejemplo:En Ubuntu
inotifywait
es proporcionado por elinotify-tools
paquete. A partir de la versión 3.13 (actual en Ubuntu 12.04)inotifywait
incluirá el nombre de archivo sin la opción -f. Las versiones anteriores pueden necesitar ser coaccionadas. Es importante tener en cuenta que la-e
opcióninotifywait
es la mejor manera de filtrar eventos. Además, suread
comando puede asignar la salida posicional en múltiples variables que puede elegir usar o ignorar. No es necesario usar grep / sed / awk para preprocesar la salida.fuente
inotifywait
era justo lo que quería.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
So, solo tienes que hacerloinotifywait -m /path -e create |
voy a tratar de editar esta respuesta.fswatch
. No lo escribí, pero es de código abierto y lo uso.Prefiero
incron
, ya que es más fácil de administrar. Esencialmente, es un servicio que aprovechainotify
y puede configurar configuraciones para tomar medidas basadas en las operaciones de cambio de archivos.Ex:
Puede ver un ejemplo completo aquí: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
fuente
Acabo de preparar esto y no veo grandes problemas con él, aparte de una pequeña posibilidad de que falten archivos entre las comprobaciones.
Si el procesamiento de su archivo no tarda demasiado, no debe perderse ningún archivo nuevo. También podría poner en segundo plano las actividades ... No es a prueba de balas, pero sirve para algunos fines sin herramientas externas como inotify.
fuente
inotify
no está disponible. Agregaría-type f
para filtrar solo archivos. De lo contrario, la carpeta también será devuelta.-f filename
opción es genial. Entonces, la única pregunta que queda es cómo hacer que esto comience al reiniciar. Voy a usar esto con mi planta solar paraos.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
que la creación de este archivo haga que la computadora maestra useespeak
y anuncie el bajo voltaje. Ya me envía un correo electrónico, pero como mi sistema ya dice la hora en la parte superior de la hora, tiene todo el resto. askubuntu.com/questions/977613/…Puedes usar
watch
en tu scriptMonitorea su carpeta y le enumera todo lo que contiene cada 0.1 segundos
Retirarse
No es en tiempo real, por lo que si un archivo fue creado y eliminado en menos de 0.1 segundos, entonces esto no funcionaría,
watch
solo admite un mínimo de 0.1 segundos.fuente
Supongo que la carpeta de destino (la llamaré
isempty
solo por conveniencia) está vacía y está esperando que se suelten uno o más archivos allí.Puede usar el siguiente comando:
solo para verificar si la carpeta todavía está vacía, de hecho devolverá un 0 si no hay un archivo nuevo (por lo tanto, la
isempty
carpeta todavía está vacía) o, por otro lado, devolverá un valor mayor que 0 (en realidad el número de archivos actualmente en la carpeta).Dicho esto, una prueba tonta si / luego puede hacer el resto del trabajo:
Por supuesto, la
do_something
función tendrá que manipular los archivos dentro de laisempty
carpeta y luego eliminarlos de la carpeta misma después del procesamiento.Agregar una línea como la siguiente en su crontab ejecutará la comprobación una vez por minuto y,
do_something
por supuesto , activará la acción si la carpeta no está vacía:fuente
ls
para hacer scripts. Usefind
o simplemente globbing en su lugar: mywiki.wooledge.org/ParsingLsSi desea detectar nuevos archivos, luego procesarlos y al final eliminar los archivos procesados puede usar systemd.path . Este método se basa en inotify. Hay una opción DirectoryNotEmpty, por lo que systemd puede ejecutar su script siempre que detecte cualquier archivo en el directorio. Debe recordar que funcionará solo si puede eliminar los archivos procesados y el script deja el directorio vacío.
Primero prepare el archivo mymonitor.service
luego vaya a mymonitor.path para definir la ruta
Si el nombre del archivo .path es el mismo que el del servicio, no es necesario especificar el nombre del servicio en el archivo .path.
Se basa en el Monitoreo de Acceso a Archivos para Dummies
fuente
entr
Usar
entr
es la nueva forma de hacer esto (es multiplataforma). Noteentr
no utiliza encuestas, lo que le da una gran ventaja sobre muchas de las alternativas.En BSD usa
pledge(2)
Puedes instalarlo con
Puede rastrear un directorio para nuevas incorporaciones usando
Opciones explicadas (de los documentos),
fuente
Bash no puede hacer esto fácilmente. Básicamente, tendría que obtener una lista de todos los archivos en la carpeta y obtener periódicamente una nueva lista y compararlos para ver qué ha cambiado.
Lo que estás buscando se llama inotify. Está integrado en el kernel de Linux y básicamente puedes sentarte allí esperando que algo suceda en ese momento, inotify regresa y dice 'hey, hay un nuevo archivo llamado foobar'
Para lograr lo que quieres, deberías cambiar a algo como perl y usar Linux :: Inotify2 (python probablemente también sea compatible con inotify, pero soy una persona perl).
fuente
Esto funciona en Cygwin y Linux. Algunas de las soluciones anteriores que escriben un archivo harán que el disco se dañe. Este scipt no tiene ese problema:
fuente
A continuación se muestra una versión abreviada de ejemplo en stackoverflow que he probado e incorporado a uno de mis proyectos que requiere la supervisión de directorios específicos.
Aquí hay un enlace a un script que usa una versión modificada de arriba para descifrar automáticamente los archivos o directorios que se encuentran en su punto de montaje sshfs; El proyecto mencionado anteriormente.
fuente