
Eu tenho uma pasta com várias subpastas, essas pastas foram asciidoctor
formatadas com arquivo com .adoc
extensã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 é inotify
uma família de chamadas de sistema, os utilitários do espaço do usuário que aproveitam essas chamadas são fornecidos pelo inotify-tools
pacote no Ubuntu (disponível no repositório Universe). Se você ainda não o possui, instale por:
sudo apt-get install inotify-tools
inotify-tools
fornece inotifywait
e inotifywatch
binários, precisamos do primeiro.
Então você deseja executar o comando asciidoctor -q some_file
quando qualquer .adoc
arquivo for modificado ( some_file
será substituído por ele), se assim for, assumindo que seus .adoc
arquivos estão em directory /foo/bar
, você pode definir o relógio:
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-q
ativa o modo silencioso, sem informações deinotifywait
si mesmo-m
ativa o modo monitor, caso contrário ele sairá após o primeiro evento--event modify
, estamos interessados apenas nomodify
evento, ou seja, quando um arquivo é modificado. Outros valores possíveis incluemopen
,close
etc.--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/*.adoc
será expandido para todos.adoc
os arquivos no/foo/bar
diretó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 grep
para filtrar apenas os arquivos desejados. Aqui configuramos o watch recursivamente ( -r
) no diretório /foo/bar
e usamos grep
para filtrar apenas .adoc
arquivos:
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 %w
resolve o nome do diretório, portanto, precisamos %f
obter o nome do arquivo. Ao assistir os arquivos, %f
resolveria a string vazia.
Observe que você também pode executar inotifywait
no -d
modo 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 asciidoctor
por qualquer outro comando de sua escolha, se desejar.
Verifique man inotifywait
para 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.conf
arquivo 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 umfestaroteiro também.
Não há necessidade de usar while
loop 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-hookable
que 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