Сценарий Bash, чтобы наблюдать изменение файла и выполнить команду

У меня есть папка с набором подпапок, эти папки имеют asciidoctor форматированный зарегистрированный с .adoc расширение.

Каждый раз я внес изменения в файлы (который часто является), я должен работать

asciidoctor -q filename.adoc

скомпилировать его в формат HTML.

Я пытаюсь автоматизировать процесс. до сих пор я шел с этим использованием, войдите:

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

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

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

Какие-либо идеи, как я мог реализовать это, автоматизируют процесс для всех подпапок?

12
задан 31 August 2016 в 12:09

4 ответа

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 получить больше идеи.

16
ответ дан 23 November 2019 в 03:36

Используя 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
ответ дан 23 November 2019 в 03:36

Хорошо я рекомендую следующее.

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done
-3
ответ дан 23 November 2019 в 03:36

Существует много инструментов там, особенно при поиске репозитория

apt-cache search monitor | grep file

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

Я протестировал эти инструменты и многих других:

  • inotify
  • fswatch
  • filewatch
  • образец
  • fileschanged
  • войти

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

  • direvent | GNU, записанный в C
  • iwatch | в Perl
  • fsniper

И между этими тремя, 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
  • отчет об имени файла
  • regex к соответствию файла поддержки
  • наблюдение mulit-файла (наблюдают больше затем всего один тип файла),
  • синхронизируйте выполнение команд (если у нас есть мультинаблюдатель),
  • обработка системного журнала (регистрируются к системному журналу, если мы хотим),
  • легкий и хороший CLI и файл конфигурации разрабатывают для работы с

Разработанный Sergey Poznyakoff.


Установка

sudo apt install direvent

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

1
ответ дан 23 November 2019 в 03:36

Другие вопросы по тегам:

Похожие вопросы: