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 inotifyfamília de chamadas do sistema, os utilitários de espaço do usuário que utilizam essas chamadas são fornecidos pelo inotify-toolspacote 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-toolsfornece inotifywaite inotifywatchbinários, precisamos do primeiro.
Portanto, você deseja executar o comando asciidoctor -q some_filequando qualquer .adocarquivo for modificado ( some_fileserá substituído por isso); se houver, assumindo que seus .adocarquivos estão no diretório /foo/bar, você pode definir o relógio:
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-qativa o modo silencioso, sem informações por inotifywaitsi só
-m ativa o modo monitor, caso contrário, ele será encerrado 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 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/*.adocserá expandido para todos os .adocarquivos no /foo/bardiretó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 greppara filtrar apenas os arquivos desejados. Aqui, configure o relógio recursivamente ( -r) no diretório /foo/bare use-o greppara filtrar apenas .adocarquivos:
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 é %wresolvido para o nome do diretório, portanto, precisamos %fobter o nome do arquivo. Enquanto assistia arquivos, %fresolveria esvaziar a string.
Observe que, você também pode executar inotifywaitno 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 asciidoctorpor qualquer outro comando de sua escolha, se desejar.
Marque man inotifywaitpara ter mais ideia.