direvent

direvent

У меня есть папка с кучей подпапок, эти папки asciidoctorотформатированы как файлы с .adocрасширением.

Каждый раз, когда я вношу изменения в файлы (а это происходит часто), мне нужно запускать

asciidoctor -q filename.adoc

для компиляции в формат HTML.

Я пытаюсь автоматизировать этот процесс. Пока что я пришел к этому, используявх:

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

но работает только с существующей папкой, а не с подпапками. Я пробовал этот вариант, но он не работает:

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

Есть идеи, как можно реализовать этот автоматизированный процесс для всех подпапок?

решение1

Linux предоставляет удобный интерфейс для мониторинга всех событий файловой системы, таких как создание, изменение, удаление файлов. Интерфейс представляет собой inotifyсемейство системных вызовов, утилиты пользовательского пространства, использующие эти вызовы, предоставляются пакетом inotify-toolsв Ubuntu (доступным в репозитории universe). Если у вас его еще нет, установите:

sudo apt-get install inotify-tools

inotify-toolsпредоставляет inotifywaitи inotifywatchдвоичные файлы, нам нужен первый.


Итак, вы хотите запустить команду asciidoctor -q some_fileпри .adocизменении любого файла ( some_fileкоторый будет заменен на него), если это так, предполагая, что ваши .adocфайлы находятся в каталоге /foo/bar, вы можете установить наблюдение:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qвключает тихий режим, никакой информации от inotifywaitсебя

  • -mвключает режим монитора, в противном случае произойдет выход после первого события

  • --event modify, нас интересует только modifyсобытие, т.е. когда файл изменяется. Другие возможные значения включают open, closeи т.д.

  • --format %w, нам нужно только имя измененного файла, а не куча другой информации, поскольку мы будем использовать имя файла в качестве входных данных для другой команды.

  • /foo/bar/*.adocбудет расширен на все .adocфайлы в /foo/barкаталоге


Теперь, как только будет выполнено какое-либо изменение, вы увидите имя файла. Теперь, чтобы выполнить команду для имени файла (предполагается, что команда принимает аргументы через STDIN):

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

Вы также можете настроить рекурсивный просмотр каталога, затем вам нужно будет использовать его grepдля фильтрации только нужных файлов. Здесь устанавливается рекурсивный просмотр ( -r) каталога /foo/barи используется grepдля фильтрации только .adocфайлов:

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

При просмотре каталогов спецификатор выходного формата %wразрешается в имя каталога, поэтому нам нужно %fполучить имя файла. При просмотре файлов %fразрешается в пустую строку.

Обратите внимание, что вы также можете запустить его inotifywaitв режиме демона ( -d), вы также можете написать сценарий всего этого, и/или запустить в фоновом режиме, и/или поиграться с другими опциями.

asciidoctorКроме того, при желании вы можете заменить ее любой другой командой по своему выбору.

Проверьте man inotifywait, чтобы получить больше информации.

решение2

Существует множество инструментов, особенно если вы ищете в своем репозитории.

apt-cache search monitor | grep file

что дает нам много инструментов. Но вам не нужно их тестировать, потому что я это сделал.

Я протестировал эти инструменты и многие другие: inotifywait(изinotify-tools),fswatch, filewatch,swatch, fileschanged, иentr.

Среди этих инструментов я нашел три полезных и надежных:

И из этих трех,direventбез сомнения, лучший.

direvent

Он настолько полезен и надежен в использовании, что я использовал его для простоготрубопроводс моими микросервисами у меня есть.

direvent.confфайл для просмотра

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

Это всего лишь один из файлов конфигурации, которые у меня есть, в котором всякий раз, когда происходят измененияписатьзатем выполняется эта команда - которая может бытьсценарий тоже.

Нет необходимости использовать whileпетлю или что-то еще.


функции

  • рекурсивный просмотр каталога
  • может быть запущен впередний планилифонкак демон
  • портативный. У меня он есть в Ubuntu, а также на сервере CentOS7
  • отчет по имени файла
  • регулярное выражение для поддержки сопоставления файлов
  • многофайловый просмотр (просмотр более одного типа файлов)
  • синхронизировать выполнение команд (если у нас есть multi-watcher)
  • Обработка syslog (при желании можно записывать в syslog)
  • простой и удобный интерфейс командной строки и дизайн конфигурационного файла для работы

РазработанСергей Позняков.


Установка

sudo apt install direvent

Но его установка с использованием исходного кода довольно проста и понятна, что дает вам последнюю версию (сейчас это: 5.1).

решение3

Использование inotifywait— это типичный подход, но есть также отдельная утилита, inotify-hookableкоторая просто позволяет вам выполнить команду при изменении файла (или каталога):

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

Похоже, что он завершает работу после однократного запуска команды; я не вижу возможности для непрерывного просмотра, поэтому вы можете сделать что-то вроде:

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

Обратите внимание, что существуют опции для рекурсивного мониторинга нескольких файлов или каталога, а также опции для игнорирования файлов/путей.

решение4

Ну, я рекомендую следующее.

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

Связанный контент