Como executar o comando quando o arquivo é alterado no Linux?

Você veio ao lugar certo se quiser aprender a executar comandos do Linux quando qualquer arquivo em um diretório de trabalho for alterado e quando novos arquivos forem criados.

No Linux, você pode usar o cron para agendar comandos para serem executados em determinados horários.

Mas e se você precisar que comandos sejam executados toda vez que um arquivo for modificado ou um novo arquivo for adicionado a um diretório?

Isso também é facilmente alcançável, e existem algumas ferramentas de linha de comando para fazer isso.

Vamos começar!

watchexec

watchexec é uma ferramenta útil e independente que monitora um determinado diretório de trabalho e executa um comando se detectar quaisquer alterações, como atualização de arquivo ou criação de novo arquivo.

Características

  • Não requer uma linha de comando complexa envolvendo xargs (argumentos estendidos).
  • Verifica as alterações no diretório atual e em todos os subdiretórios em tempo real.
  • Não há necessidade de um tempo de execução de linguagem e não está conectado a nenhuma linguagem ou ecossistema específico.
  • .gitignore e .ignore são usados ​​por padrão para decidir para quais arquivos ignorar notificações.
  • Os grupos de processos são usados ​​para acompanhar os programas de bifurcação.
  • A visualização de arquivos com uma determinada extensão é suportada.
  • É compatível com OS X, Linux e Windows.
  • Filtrando e ignorando eventos com base em glob (é possível encontrar padrões de pesquisa de arquivos para encontrar nomes de arquivos parcialmente idênticos.

Instalação do watchexec

Para instalar facilmente a ferramenta watchexec, cole o seguinte link no terminal ou em um prompt de shell e pressione enter.

  Como formatar um dispositivo USB para Fat32 no Linux

Linux e macOS

curl -sS https://webinstall.dev/watchexec | bash

Após a instalação bem-sucedida, o caminho será exibido na tela. No meu caso, esta ferramenta foi instalada em /root/.local/bin

┌──(root💀kali)-[~]
└─# curl -sS https://webinstall.dev/watchexec | bash

Thanks for using webi to install '[email protected]' on 'Linux/x86_64'.
Have a problem? Experience a bug? Please let us know:
        https://github.com/webinstall/webi-installers/issues

Lovin' it? Say thanks with a Star on GitHub:
        https://github.com/webinstall/webi-installers

Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec
Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec

E após a instalação, navegue até o repositório .local/bin e verifique se o arquivo está lá ou não usando esses comandos.

cd .local/bin

ls

A próxima etapa é exportar o caminho para usar a ferramenta watchexec.

export PATH="/root/.local/bin:$PATH"

Para executar, basta digitar watchexec no terminal como usuário root. Use este comando para ver quais sinalizadores e opções podem ser usados ​​com a ferramenta watchexec.

watchexec --help

Comandos de exemplo de exemplo

  • Chame ls -la quando qualquer arquivo for alterado neste diretório/subdiretório. Este comando mostra todos os arquivos presentes no diretório sempre que detecta alguma modificação.
watchexec -- ls -la
  • Sempre que qualquer um dos arquivos de extensão python, js, CSS ou Html no diretório atual for alterado, execute o comando. Aqui você pode passar qualquer comando que desejar. As extensões de arquivo devem ser separadas por uma vírgula.
 watchexec --exts py,js,css,html <command>
  • Execute o comando quando qualquer arquivo em lib ou src for alterado. A opção “-w” observa um arquivo ou diretório específico no sistema.
watchexec -w lib -w src <command>
  • Chame/reinicie qualquer serviço quando qualquer arquivo no diretório atual (e todos os subdiretórios) for alterado.
watchexec -e html -r tor

watchexec -e js,py -r mysql

Aqui, a opção “-r” reinicia o processo ou serviço se estiver em execução no sistema.

  Como usar o Unified Remote para controlar um PC Linux

Para mais exemplos de uso do watchexec, você pode visitar o repositório oficial do GitHub.

entrada

entrada é um utilitário de linha de comando simples e excelente para executar comandos arbitrários quando ocorrer alguma modificação em um determinado diretório.

“entr” significa Event Notify Test Runner. Esta ferramenta foi criada com o objetivo de fazer feedback rápido e testes automatizados.

Instalação

entr está pré-instalado na distribuição Linux. Caso esteja faltando, você precisa instalá-lo manualmente.

Esta ferramenta é simples de usar e pode ser instalada com o seguinte comando.

sudo apt-get install entr

Ou você também pode instalá-lo clonando o oficial Repositório Git.

git clone https://github.com/eradman/entr.git

Em seguida, navegue até esse diretório e instale os requisitos usando os comandos abaixo.

./configure
make test
make install

Para ver as opções de compilação disponíveis, execute ./configure -h

Comandos de exemplo de exemplo

Para ver as opções e argumentos disponíveis para o comando entr. Use o seguinte comando.

man entr

Este comando exibe o manual do usuário para o comando entr.

NAME
     entr — run arbitrary commands when files change

SYNOPSIS
     entr [-acdnprsz] utility [argument /_ ...]

DESCRIPTION
     A list of files provided on standard input, and the utility is executed using the supplied arguments
     if any of them change.  entr waits for the child process to finish before responding to subsequent
     file system events.  A TTY is also opened before entering the watch loop in order to support interac‐
     tive utilities.

     The arguments are as follows:

     -a      Respond to all events which occur while the utility is running.  Without this option, entr
             consolidates events in order to avoid looping.  This option has no effect in conjunction with
             the -r flag.

     -c      Clear the screen before invoking the utility specified on the command line.  Specify twice to
             erase the scroll back buffer.

     -d      Track the directories of regular files provided as input and exit if a new file is added.
             This option also enables directories to be specified explicitly.  If specified twice, all new
             entries to a directory are recognized, otherwise files with names beginning with ‘.’ are ig‐
             nored.

     -n      Run in non-interactive mode.  In this mode entr does not attempt to read from the TTY or
             change its properties.

     -p      Postpone the first execution of the utility until a file is modified.

 Manual page entr(1) line 1 (press h for help or q to quit)
  • Para iniciar e recarregar automaticamente um servidor MySQL quando qualquer arquivo JavaScript for alterado no diretório de trabalho. Cada vez que as alterações são salvas no arquivo, entr recarrega o servidor MySQL.
 ls *.js | entr -r mysql
  • Para recarregar automaticamente um servidor web ou encerrar se o servidor sair.
$ ls * | entr -rz ./httpd

Para mais detalhes e exemplos no comando entr, você pode visitar o site oficial Repositório do GitHub.

  Os 4 melhores clientes Github para Linux

Palavras finais 👩‍💻

Espero que você tenha achado este artigo muito útil para aprender como executar comandos do Linux quando qualquer arquivo em um determinado diretório é alterado e quando novos arquivos são criados.

Você também pode estar interessado em aprender como remover arquivos e diretórios no Linux.