direvent

direvent

Ich habe einen Ordner mit einer Reihe von Unterordnern, diese Ordner haben asciidoctorformatierte Dateien mit .adocder Erweiterung.

Jedes Mal, wenn ich Änderungen an Dateien vornehme (was oft vorkommt), muss ich

asciidoctor -q filename.adoc

um es in das HTML-Format zu kompilieren.

Ich versuche, den Prozess zu automatisieren. Bisher bin ich damit zurechtgekommen mitEintrag:

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

funktioniert aber nur mit vorhandenen Ordnern, nicht mit Unterordnern. Ich habe diese Variante ausprobiert, aber sie funktioniert nicht:

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

Irgendwelche Ideen, wie ich diesen automatisierten Prozess für alle Unterordner implementieren könnte?

Antwort1

Linux bietet eine nette Schnittstelle zur Überwachung aller Dateisystemereignisse wie Erstellen, Ändern und Entfernen von Dateien. Die Schnittstelle ist inotifyeine Familie von Systemaufrufen. Die Benutzerbereichs-Dienstprogramme, die diese Aufrufe nutzen, werden vom inotify-toolsPaket in Ubuntu bereitgestellt (verfügbar im Universe-Repository). Wenn Sie es noch nicht haben, installieren Sie es wie folgt:

sudo apt-get install inotify-tools

inotify-toolsbietet inotifywaitund inotifywatchBinärdateien, wir brauchen das erste.


Sie möchten also den Befehl ausführen, asciidoctor -q some_filewenn eine beliebige .adocDatei geändert wird ( some_filewird dadurch ersetzt). Wenn dies der Fall ist und Ihre .adocDateien sich im Verzeichnis befinden /foo/bar, können Sie die Überwachung folgendermaßen einstellen:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qaktiviert den Ruhemodus, keine Informationen von inotifywaitsich selbst

  • -maktiviert den Monitormodus, andernfalls wird er nach dem ersten Ereignis beendet

  • --event modify, wir sind nur am modifyEreignis interessiert, d. h. wenn eine Datei geändert wird. Andere mögliche Werte sind open, closeusw.

  • --format %w, wir möchten nur den Dateinamen, der geändert wird, und keine Menge anderer Informationen, da wir den Dateinamen als Eingabe für einen anderen Befehl verwenden werden

  • /foo/bar/*.adocwird auf alle .adocDateien im /foo/barVerzeichnis erweitert


Oben wird Ihnen nun der Dateiname angezeigt, wenn einer geändert wird. Führen Sie nun den Befehl für den Dateinamen aus (vorausgesetzt, der Befehl akzeptiert Argumente über STDIN):

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

Sie können auch eine rekursive Überwachung des Verzeichnisses einrichten, die Sie dann nur verwenden müssen, grepum die gewünschten Dateien herauszufiltern. Hier können Sie die Überwachung rekursiv ( -r) auf das Verzeichnis einrichten /foo/barund nur Dateien grepherausfiltern :.adoc

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

Beim Überwachen von Verzeichnissen wird der Ausgabeformatbezeichner %win den Verzeichnisnamen aufgelöst, daher müssen wir %fden Dateinamen abrufen. Beim Überwachen von Dateien %fwürde dies in eine leere Zeichenfolge aufgelöst.

inotifywaitBeachten Sie, dass Sie es auch im Daemon-Modus ( ) ausführen können. -dSie können das Ganze auch als Skript ausführen und/oder im Hintergrund ausführen und/oder mit anderen Optionen experimentieren.

asciidoctorSie können es auch durch jeden anderen Befehl Ihrer Wahl ersetzen , wenn Sie möchten.

Schauen Sie nach man inotifywait, um mehr zu erfahren.

Antwort2

Es gibt viele Tools da draußen, vor allem wenn Sie durch Ihr Repository suchen

apt-cache search monitor | grep file

das gibt uns viele Werkzeuge. Aber Sie müssen sie nicht testen, weil ich das getan habe.

Ich habe diese und viele andere Tools getestet: inotifywait(voninotify-tools),fswatch, filewatch,swatch, fileschanged, Undentr.

Drei dieser Tools fand ich nützlich und zuverlässig:

Und von diesen dreien ist diedireventist ohne Zweifel das Beste.

direvent

Es ist so nützlich und zuverlässig in der Anwendung, dass ich es für eine einfachePipelinemit meinen Microservices habe ich.

direvent.confDatei zum Ansehen

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);
}

Dies ist nur eine der Konfigurationsdateien, die ich habe, in denen immer, wenn es eine Änderung fürschreibendann wird dieser Befehl ausgeführt - das könnte einSkript ebenfalls.

whileEs ist nicht nötig , Loops oder anderes Zeug zu verwenden .


Merkmale

  • rekursives Überwachen eines Verzeichnisses
  • kann ausgeführt werden inVordergrundoderHintergrundals Daemon
  • tragbar. Ich habe es sowohl auf Ubuntu als auch auf dem CentOS7-Server
  • Dateiname Bericht
  • Regex zur Unterstützung des Dateiabgleichs
  • Mehrfachdateiüberwachung (mehr als nur einen Dateityp überwachen)
  • Befehlsausführung synchronisieren (wenn wir mehrere Watcher haben)
  • Syslog-Handling (auf Wunsch ins Syslog protokollieren)
  • einfaches und gutes CLI- und Konfigurationsdateidesign zum Arbeiten

Entwickelt vonSergej Posnjakoff.


Installieren

sudo apt install direvent

Die Installation mithilfe des Quellcodes ist jedoch ziemlich einfach und unkompliziert und Sie erhalten die letzte Version (derzeit: 5.1).

Antwort3

Die typische Vorgehensweise ist die Verwendung von inotifywait, es gibt jedoch auch ein separates Dienstprogramm namens , inotify-hookablemit dem Sie einfach einen Befehl ausführen können, wenn sich eine Datei (oder ein Verzeichnis) ändert:

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

Es scheint, als würde es nach einmaligem Auslösen des Befehls beendet. Ich sehe keine Option zum kontinuierlichen Beobachten, Sie könnten also etwas wie Folgendes tun:

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

Beachten Sie, dass es Optionen zum rekursiven Überwachen mehrerer Dateien oder eines Verzeichnisses sowie Optionen zum Ignorieren von Dateien/Pfaden gibt.

Antwort4

Nun, ich empfehle Folgendes.

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

verwandte Informationen