У меня есть папка с набором подпапок, эти папки имеют asciidoctor
форматированный зарегистрированный с .adoc
расширение.
Каждый раз я внес изменения в файлы (который часто является), я должен работать
asciidoctor -q filename.adoc
скомпилировать его в формат HTML.
Я пытаюсь автоматизировать процесс. до сих пор я шел с этим использованием, войдите:
ls *.adoc | entr asciidoctor -q *.adoc
но только работы с существующей папкой не для подпапок. Я попробовал это изменение, но оно не работает:
find . -name '*.adoc' | entr asciidoctor -q *.adoc
Какие-либо идеи, как я мог реализовать это, автоматизируют процесс для всех подпапок?
Linux обеспечивает хороший интерфейс для того, чтобы следить за развитием всех событий файловой системы как создание, изменение, удаляя файлы. Интерфейс inotify
семейство системных вызовов, утилиты пространства пользователя, усиливающие эти вызовы, обеспечивается inotify-tools
пакет в Ubuntu (доступный на репозитории вселенной). Если у Вас уже нет его, установите:
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 | asciidoctor -q
Можно также установить рекурсивные часы на каталоге, необходимо будет затем использовать grep
отфильтровать желаемые файлы только. Установка Here часы рекурсивно (-r
) на каталоге /foo/bar
и использование grep
отфильтровать только .adoc
файлы:
inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q
При наблюдении каталогов спецификатор выходного формата %w
твердость к имени каталога, таким образом, нам нужно %f
получить имя файла. При наблюдении файлов, %f
решил бы к пустой строке.
Обратите внимание, что, можно также работать inotifywait
в демоне (-d
) режим, можно также написать сценарий всего этого, и/или работать в фоне и/или играть с ним больше других опций.
Кроме того, можно заменить asciidoctor
с любой другой командой по Вашему выбору, если Вы хотите.
Проверить man inotifywait
получить больше идеи.
Используя 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
Примечание там опции контролировать несколько файлов или каталог, рекурсивно, и опции проигнорировать файлы/пути.
Хорошо я рекомендую следующее.
#!/bin/bash
#Script
for SRC in *.adoc;
do
asciidoctor -q $SRC
done
Существует много инструментов там, особенно при поиске репозитория
apt-cache search monitor | grep file
который дает нам много инструментов. Но Вы не должны тестировать их, потому что я сделал это.
Я протестировал эти инструменты и многих других:
Среди этих инструментов я нашел трех из них полезными и надежными:
И между этими тремя, 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
цикл или другой материал.
Разработанный Sergey Poznyakoff.
sudo apt install direvent
Но установка его с помощью его исходного кода довольно легка и проста, который дает Вам последнюю версию (прямо сейчас: 5.1).