
Tengo una carpeta con un montón de subcarpetas, estas carpetas están asciidoctor
formateadas y archivadas con .adoc
extensió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 inotify
una familia de llamadas al sistema; las utilidades del espacio de usuario que aprovechan estas llamadas las proporciona el inotify-tools
paquete en Ubuntu (disponible en el repositorio del universo). Si aún no lo tienes, instálalo mediante:
sudo apt-get install inotify-tools
inotify-tools
proporciona inotifywait
y inotifywatch
binarios, necesitamos el primero.
Por lo tanto, desea ejecutar el comando asciidoctor -q some_file
cuando .adoc
se modifica cualquier archivo ( some_file
se reemplazará por ese), de ser así, suponiendo que sus .adoc
archivos estén en el directorio /foo/bar
, puede configurar el reloj:
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-q
habilita el modo silencioso, no hay información deinotifywait
sí mismo-m
habilita el modo monitor; de lo contrario, saldrá después del primer evento--event modify
, sólo nos interesa elmodify
evento, es decir, cuando se modifica un archivo. Otros valores posibles incluyenopen
,close
etc.--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/*.adoc
se expandirá a todos.adoc
los archivos bajo/foo/bar
el 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 grep
para filtrar solo los archivos deseados. Aquí configuramos el reloj de forma recursiva ( -r
) en el directorio /foo/bar
y lo usamos grep
para filtrar solo .adoc
archivos:
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 %w
se resuelve en el nombre del directorio, por lo que necesitamos %f
obtener el nombre del archivo. Mientras mira archivos, %f
se resolverá con una cadena vacía.
Tenga en cuenta que también puede ejecutar inotifywait
en modo demonio ( -d
), también puede programar todo y/o ejecutarlo en segundo plano y/o jugar con otras opciones.
Además, puedes reemplazarlo asciidoctor
con cualquier otro comando de tu elección, si lo deseas.
Compruébalo man inotifywait
para 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, eldirevent
es el mejor sin duda.
direvent
Es tan útil y confiable de usar que lo he usado por un simpletuberíacon mis microservicios tengo.
direvent.conf
archivo 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 unintentoguión también.
No es necesario utilizar while
bucles 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 inotifywait
es el enfoque típico, pero también hay una utilidad separada llamada inotify-hookable
que 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