
У меня есть папка с кучей подпапок, эти папки 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