
Ich habe einen Ordner mit einer Reihe von Unterordnern, diese Ordner haben asciidoctor
formatierte Dateien mit .adoc
der 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 inotify
eine Familie von Systemaufrufen. Die Benutzerbereichs-Dienstprogramme, die diese Aufrufe nutzen, werden vom inotify-tools
Paket 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-tools
bietet inotifywait
und inotifywatch
Binärdateien, wir brauchen das erste.
Sie möchten also den Befehl ausführen, asciidoctor -q some_file
wenn eine beliebige .adoc
Datei geändert wird ( some_file
wird dadurch ersetzt). Wenn dies der Fall ist und Ihre .adoc
Dateien sich im Verzeichnis befinden /foo/bar
, können Sie die Überwachung folgendermaßen einstellen:
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-q
aktiviert den Ruhemodus, keine Informationen voninotifywait
sich selbst-m
aktiviert den Monitormodus, andernfalls wird er nach dem ersten Ereignis beendet--event modify
, wir sind nur ammodify
Ereignis interessiert, d. h. wenn eine Datei geändert wird. Andere mögliche Werte sindopen
,close
usw.--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/*.adoc
wird auf alle.adoc
Dateien im/foo/bar
Verzeichnis 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, grep
um die gewünschten Dateien herauszufiltern. Hier können Sie die Überwachung rekursiv ( -r
) auf das Verzeichnis einrichten /foo/bar
und nur Dateien grep
herausfiltern :.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 %w
in den Verzeichnisnamen aufgelöst, daher müssen wir %f
den Dateinamen abrufen. Beim Überwachen von Dateien %f
würde dies in eine leere Zeichenfolge aufgelöst.
inotifywait
Beachten Sie, dass Sie es auch im Daemon-Modus ( ) ausführen können. -d
Sie können das Ganze auch als Skript ausführen und/oder im Hintergrund ausführen und/oder mit anderen Optionen experimentieren.
asciidoctor
Sie 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 diedirevent
ist 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.conf
Datei 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 einSchlagSkript ebenfalls.
while
Es 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-hookable
mit 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