Se você deseja aprender a executar comandos no Linux sempre que um arquivo em um diretório de trabalho é alterado ou novos arquivos são criados, você está no lugar certo.
No Linux, o agendamento de comandos para execução em momentos específicos pode ser feito através do cron.
Mas, e se você precisar que comandos sejam executados automaticamente toda vez que um arquivo for modificado ou um novo arquivo for adicionado a uma pasta?
Isso é totalmente possível e algumas ferramentas de linha de comando podem facilitar essa tarefa.
Vamos começar!
Watchexec
Watchexec é uma ferramenta útil e autônoma que monitora um diretório específico, executando um comando ao detectar alterações, como atualizações de arquivos ou criação de novos.
Funcionalidades
- Elimina a necessidade de linhas de comando complexas envolvendo xargs (argumentos estendidos).
- Monitora em tempo real as alterações no diretório atual e em todos os seus subdiretórios.
- Não depende de nenhum ambiente de execução de linguagem, sendo independente de qualquer linguagem ou ecossistema específico.
- Utiliza .gitignore e .ignore por padrão para determinar quais arquivos devem ser ignorados.
- Utiliza grupos de processos para gerenciar programas bifurcados.
- Oferece suporte à visualização de arquivos com extensões específicas.
- Compatível com macOS, Linux e Windows.
- Permite filtrar e ignorar eventos com base em glob (padrões para busca de nomes de arquivos parcialmente idênticos).
Instalação do Watchexec
Para instalar o Watchexec, cole o seguinte comando no seu terminal e pressione enter:
curl -sS https://webinstall.dev/watchexec | bash
Após a instalação, o caminho onde a ferramenta foi instalada será exibido. No exemplo abaixo, a 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
Após a instalação, verifique se o arquivo foi criado na pasta .local/bin com os seguintes comandos:
cd .local/bin ls
O próximo passo é adicionar o caminho da ferramenta à variável de ambiente PATH:
export PATH="/root/.local/bin:$PATH"
Para executar, digite ‘watchexec’ no terminal como usuário root. Para ver as opções de uso, utilize:
watchexec --help
Exemplos de Uso
- Para listar todos os arquivos no diretório/subdiretório toda vez que houver uma mudança:
watchexec -- ls -la
- Para executar um comando sempre que houver alterações em arquivos com extensões .py, .js, .css ou .html:
watchexec --exts py,js,css,html <comando>
- Para executar um comando quando houver alteração em arquivos nas pastas ‘lib’ ou ‘src’:
watchexec -w lib -w src <comando>
- Para reiniciar um serviço sempre que houver alteração nos arquivos (incluindo subdiretórios):
watchexec -e html -r tor watchexec -e js,py -r mysql
A opção ‘-r’ reinicia um processo ou serviço em execução no sistema.
Para mais informações sobre o Watchexec, visite o repositório oficial no GitHub.
Entr
Entr é uma ferramenta de linha de comando simples e eficaz que executa comandos quando ocorrem alterações em um determinado diretório.
“Entr” significa Event Notify Test Runner e foi criado com o objetivo de automatizar testes e fornecer feedback rápido.
Instalação
Entr já vem pré-instalado em algumas distribuições Linux. Caso não esteja, você pode instalá-lo manualmente.
A ferramenta é fácil de usar e pode ser instalada com o seguinte comando:
sudo apt-get install entr
Ou você também pode instalá-lo clonando o repositório oficial do GitHub:
git clone https://github.com/eradman/entr.git
Em seguida, navegue até o diretório e instale as dependências:
./configure make test make install
Para ver as opções de compilação, execute: ‘./configure -h’
Exemplos de Uso
Para ver as opções e argumentos disponíveis para o comando ‘entr’, utilize:
man entr
Este comando exibe o manual do usuário para ‘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 ou recarregar automaticamente um servidor MySQL sempre que um arquivo JavaScript for alterado:
ls *.js | entr -r mysql
- Para recarregar automaticamente um servidor web, ou encerrar caso o servidor finalize a execução:
$ ls * | entr -rz ./httpd
Para mais detalhes e exemplos do comando ‘entr’, você pode consultar o repositório oficial no GitHub.
Considerações Finais 👩💻
Espero que este artigo tenha sido útil para você entender como executar comandos no Linux quando arquivos são alterados ou criados em um diretório.
Você também pode se interessar em aprender como remover arquivos e diretórios no Linux.