direvent

direvent

Tengo una carpeta con un montón de subcarpetas, estas carpetas están asciidoctorformateadas y archivadas con .adocextensión.

Cada vez que hago cambios en los archivos (lo cual es frecuente), necesito ejecutar

asciidoctor -q filename.adoc

para compilarlo en formato HTML.

Estoy intentando automatizar el proceso. hasta ahora he llegado con esto usandoentrar:

ls *.adoc | entr asciidoctor -q *.adoc

pero solo funciona con carpetas existentes, no con subcarpetas. He probado esta variación, pero no funciona:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

¿Alguna idea de cómo podría implementar este proceso de automatización para todas las subcarpetas?

Respuesta1

Linux proporciona una interfaz agradable para monitorear todos los eventos del sistema de archivos, como crear, modificar y eliminar archivos. La interfaz es inotifyuna familia de llamadas al sistema; las utilidades del espacio de usuario que aprovechan estas llamadas las proporciona el inotify-toolspaquete en Ubuntu (disponible en el repositorio del universo). Si aún no lo tienes, instálalo mediante:

sudo apt-get install inotify-tools

inotify-toolsproporciona inotifywaity inotifywatchbinarios, necesitamos el primero.


Por lo tanto, desea ejecutar el comando asciidoctor -q some_filecuando .adocse modifica cualquier archivo ( some_filese reemplazará por ese), de ser así, suponiendo que sus .adocarchivos estén en el directorio /foo/bar, puede configurar el reloj:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qhabilita el modo silencioso, no hay información de inotifywaitsí mismo

  • -mhabilita el modo monitor; de lo contrario, saldrá después del primer evento

  • --event modify, sólo nos interesa el modifyevento, es decir, cuando se modifica un archivo. Otros valores posibles incluyen open, closeetc.

  • --format %w, solo queremos el nombre del archivo que se modifica en lugar de mucha otra información, ya que usaremos el nombre del archivo como entrada para otro comando.

  • /foo/bar/*.adocse expandirá a todos .adoclos archivos bajo /foo/barel directorio


Ahora lo anterior le mostrará el nombre del archivo cada vez que se modifique alguno, ahora para ejecutar el comando en el nombre del archivo (asumiendo que el comando toma argumentos a través de STDIN):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | while read -r file ; do
    asciidoctor -q "$file"
done

También puede configurar una vigilancia recursiva en el directorio, que luego deberá utilizar greppara filtrar solo los archivos deseados. Aquí configuramos el reloj de forma recursiva ( -r) en el directorio /foo/bary lo usamos greppara filtrar solo .adocarchivos:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | while read -r file ; do
    asciidoctor -q "$file"
done

Al observar directorios, el especificador de formato de salida %wse resuelve en el nombre del directorio, por lo que necesitamos %fobtener el nombre del archivo. Mientras mira archivos, %fse resolverá con una cadena vacía.

Tenga en cuenta que también puede ejecutar inotifywaiten modo demonio ( -d), también puede programar todo y/o ejecutarlo en segundo plano y/o jugar con otras opciones.

Además, puedes reemplazarlo asciidoctorcon cualquier otro comando de tu elección, si lo deseas.

Compruébalo man inotifywaitpara tener más ideas.

Respuesta2

Existen muchas herramientas, especialmente si buscas en tu repositorio.

apt-cache search monitor | grep file

lo que nos da muchas herramientas. Pero no tienes que probarlos porque yo hice eso.

He probado estas herramientas y muchas otras: inotifywait(deinotify-tools),fswatch, filewatch,swatch, fileschanged, yentr.

Entre estas herramientas encontré tres útiles y confiables:

Y de estos tres, eldireventes el mejor sin duda.

direvent

Es tan útil y confiable de usar que lo he usado por un simpletuberíacon mis microservicios tengo.

direvent.confarchivo para ver

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

Este es sólo uno de los archivos de configuración que tengo en el que cada vez que hay un cambio paraescribirluego se ejecuta este comando, que podría ser unguión también.

No es necesario utilizar whilebucles ni otras cosas.


características

  • mirando recursivamente un directorio
  • se puede ejecutar enprimer planoofondocomo un demonio
  • portátil. Lo tengo en Ubuntu y en el servidor CentOS7.
  • informe de nombre de archivo
  • expresiones regulares para admitir la coincidencia de archivos
  • visualización de múltiples archivos (ver más de un solo tipo de archivo)
  • sincronizar la ejecución de comandos (si tenemos multi-watcher)
  • manejo de syslog (iniciar sesión en syslog si queremos)
  • Diseño de archivos de configuración y CLI fácil y bueno para trabajar

Desarrollado porSerguéi Pozniakoff.


Instalación

sudo apt install direvent

Pero instalarlo usando su código fuente es bastante fácil y directo, lo que le brinda la última versión (en este momento es: 5.1).

Respuesta3

Usar inotifywaites el enfoque típico, pero también hay una utilidad separada llamada inotify-hookableque simplemente te permite ejecutar un comando cuando un archivo (o directorio) cambia:

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

Parece salir después de activar el comando una vez; No veo una opción para mirar continuamente, por lo que podrías hacer algo como:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

Tenga en cuenta que hay opciones para monitorear varios archivos o un directorio, de forma recursiva, y opciones para ignorar archivos/rutas.

Respuesta4

Bueno te recomiendo lo siguiente.

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

información relacionada