direvent

direvent

Eu tenho uma pasta com várias subpastas, essas pastas foram asciidoctorformatadas com arquivo com .adocextensão.

Toda vez que faço alterações nos arquivos (o que acontece com frequência), preciso executar

asciidoctor -q filename.adoc

para compilá-lo em formato HTML.

Estou tentando automatizar o processo. até agora eu cheguei com isso usandoentrada:

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

mas funciona apenas com pastas existentes e não com subpastas. Eu tentei esta variação, mas não funciona:

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

Alguma idéia de como eu poderia implementar esse processo automatizado para todas as subpastas?

Responder1

O Linux fornece uma interface agradável para monitorar todos os eventos do sistema de arquivos, como criação, modificação e remoção de arquivos. A interface é inotifyuma família de chamadas de sistema, os utilitários do espaço do usuário que aproveitam essas chamadas são fornecidos pelo inotify-toolspacote no Ubuntu (disponível no repositório Universe). Se você ainda não o possui, instale por:

sudo apt-get install inotify-tools

inotify-toolsfornece inotifywaite inotifywatchbinários, precisamos do primeiro.


Então você deseja executar o comando asciidoctor -q some_filequando qualquer .adocarquivo for modificado ( some_fileserá substituído por ele), se assim for, assumindo que seus .adocarquivos estão em directory /foo/bar, você pode definir o relógio:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qativa o modo silencioso, sem informações de inotifywaitsi mesmo

  • -mativa o modo monitor, caso contrário ele sairá após o primeiro evento

  • --event modify, estamos interessados ​​apenas no modifyevento, ou seja, quando um arquivo é modificado. Outros valores possíveis incluem open, closeetc.

  • --format %w, queremos apenas que o nome do arquivo seja modificado, em vez de muitas outras informações, pois usaremos o nome do arquivo como entrada para outro comando

  • /foo/bar/*.adocserá expandido para todos .adocos arquivos no /foo/bardiretório


Agora o texto acima mostrará o nome do arquivo sempre que algum for modificado, agora para executar o comando no nome do arquivo (assumindo que o comando receba argumentos via STDIN):

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

Você também pode configurar uma observação recursiva no diretório, que precisará ser usada greppara filtrar apenas os arquivos desejados. Aqui configuramos o watch recursivamente ( -r) no diretório /foo/bare usamos greppara filtrar apenas .adocarquivos:

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

Ao observar diretórios, o especificador de formato de saída %wresolve o nome do diretório, portanto, precisamos %fobter o nome do arquivo. Ao assistir os arquivos, %fresolveria a string vazia.

Observe que você também pode executar inotifywaitno -dmodo daemon (), também pode criar scripts de tudo e/ou executar em segundo plano e/ou brincar com mais outras opções.

Além disso, você pode substituir asciidoctorpor qualquer outro comando de sua escolha, se desejar.

Verifique man inotifywaitpara ter mais ideia.

Responder2

Existem muitas ferramentas por aí, especialmente se você pesquisar em seu repositório

apt-cache search monitor | grep file

o que nos dá muitas ferramentas. Mas você não precisa testá-los porque eu fiz isso.

Eu testei essas ferramentas e muitas outras: inotifywait(deinotify-tools),fswatch, filewatch,swatch, fileschanged, eentr.

Entre essas ferramentas encontrei três delas úteis e confiáveis:

E desses três, odireventé o melhor sem dúvida.

direvent

É tão útil e confiável de usar que o usei para um simplesgasodutocom meus microsserviços que tenho.

direvent.confarquivo para assistir

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

Este é apenas um dos arquivos de configuração que tenho onde sempre que há uma mudança paraescreverentão este comando é executado - o que poderia ser umroteiro também.

Não há necessidade de usar whileloop ou outras coisas.


características

  • observando recursivamente um diretório
  • pode ser executado emprimeiro planooufundocomo um daemon
  • portátil. Eu tenho isso no Ubuntu e também no servidor CentOS7
  • relatório de nome de arquivo
  • regex para suportar correspondência de arquivos
  • observação de vários arquivos (assistir mais de um tipo de arquivo)
  • sincronizar a execução de comandos (se tivermos multi-watcher)
  • manipulação de syslog (registre no syslog se quisermos)
  • CLI fácil e bom e design de arquivo de configuração para trabalhar

Desenvolvido porSergei Poznyakoff.


Instalando

sudo apt install direvent

Mas instalá-lo usando seu código-fonte é bastante fácil e direto, o que lhe dá a última versão (agora é: 5.1).

Responder3

Usar inotifywaité a abordagem típica, mas também há um utilitário separado chamado inotify-hookableque permite executar um comando quando um arquivo (ou diretório) é alterado:

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

Parece sair depois de acionar o comando uma vez; Não vejo opção para visualização contínua, então você poderia fazer algo como:

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

Observe que existem opções para monitorar vários arquivos ou um diretório, recursivamente, e opções para ignorar arquivos/caminhos.

Responder4

Bem, eu recomendo o seguinte.

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

informação relacionada