O Linux fornece uma interface agradável para monitorar todos os eventos do sistema de arquivos, como criar, modificar e remover arquivos. A interface é uma inotify
família de chamadas do sistema, os utilitários de espaço do usuário que utilizam essas chamadas são fornecidos pelo inotify-tools
pacote no Ubuntu (disponível no repositório do universo). 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.
Portanto, você deseja executar o comando asciidoctor -q some_file
quando qualquer .adoc
arquivo for modificado ( some_file
será substituído por isso); se houver, assumindo que seus .adoc
arquivos estão no diretório /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 por inotifywait
si só
-m
ativa o modo monitor, caso contrário, ele será encerrado após o primeiro evento
--event modify
, estamos interessados apenas no modify
evento, ou seja, quando um arquivo é modificado. Outros valores possíveis incluem open
, close
etc.
--format %w
, queremos apenas o nome do arquivo modificado em vez de várias outras informações, pois usaremos o nome do arquivo como entrada para outro comando
/foo/bar/*.adoc
será expandido para todos os .adoc
arquivos no /foo/bar
diretório
Agora, o acima mostrará o nome do arquivo sempre que qualquer um 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 | asciidoctor -q
Você também pode configurar uma inspeção recursiva no diretório, depois precisará usar grep
para filtrar apenas os arquivos desejados. Aqui, configure o relógio recursivamente ( -r
) no diretório /foo/bar
e use-o grep
para filtrar apenas .adoc
arquivos:
inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q
Ao assistir aos diretórios, o especificador de formato de saída é %w
resolvido para o nome do diretório, portanto, precisamos %f
obter o nome do arquivo. Enquanto assistia arquivos, %f
resolveria esvaziar a string.
Observe que, você também pode executar inotifywait
no modo daemon ( -d
), também pode escrever a coisa toda e / ou executar em segundo plano e / ou brincar com ela mais outras opções.
Além disso, você pode substituir asciidoctor
por qualquer outro comando de sua escolha, se desejar.
Marque man inotifywait
para ter mais ideia.