Como executar uma tarefa quando um novo arquivo é adicionado a um diretório no Linux
Este tutorial mostrará a você como usar os eventos do sistema de arquivos do Linux (notificar) para ser notificado toda vez que um arquivo aparecer em um diretório. Você pode usá-los como acionadores para automatizar tarefas comuns em seu sistema.
Vamos criar um script que observe um diretório e aja em novos arquivos adicionados. Cada arquivo é gzipado e movido para outro diretório, assim que é detectado. O script usa o subsistema inotify, por meio de um utilitário chamado inotify-tools. Mas primeiro, vamos instalar a ferramenta e experimentar.
Instalando inotify-tools e gzip
Use o apt-get para instalar este pacote no seu sistema se você estiver usando o Ubuntu ou outra distribuição baseada no Debian. Em outras distribuições Linux, use a ferramenta de gerenciamento de pacotes da sua distribuição Linux.
sudo apt-get instale o inotify-tools gzip
Experimentando com inotify-tools
p> Vamos começar assistindo a um diretório e ver quais eventos são iniciados quando novos arquivos chegam. Usaremos uma ferramenta chamada inotifywatch, que faz parte das ferramentas inotify. Crie um novo diretório chamado “incoming”:
mkdir de entrada
Comece a ver este diretório executando o seguinte comando:
inotifywatch - v incoming
Isso instruirá inotify para observar todos os eventos do sistema de arquivos no diretório “incoming”. A opção -v faz com que a ferramenta imprima informações extras sobre o que está fazendo. Não especificamos uma opção de tempo limite (-t) e o comando continuará coletando eventos até sairmos com CTRL + C. Neste ponto, nosso terminal deve ser algo como isto:
Abra uma nova janela de terminal (ou aba) e mude para o diretório de entrada. Use o comando touch para criar um novo arquivo chamado "newfile".
cd entrada / touch newfile
Agora volte para a primeira janela do terminal e pare o inotifywatch pressionando CTRL + C.
Uma tabela de eventos será exibida no console, indicando uma instância de "create", "open", "attrib" e "close_write". Esses quatro eventos ocorreram quando usamos o touch para criar um novo arquivo, definir seus atributos de acesso ao arquivo, abri-lo para gravar um caractere de terminação nula e, em seguida, fechá-lo posteriormente. Esses são apenas alguns dos vários eventos que podem ser monitorados em um sistema de arquivos com ferramentas inotify. Você pode ver a lista completa na página principal do inotifywatch.
Para nossos objetivos, estamos interessados apenas em dois eventos:
- “criar” - quando um arquivo é criado no diretório de destino.
- “moved_to” - quando um arquivo é movido de outro local para o diretório de destino.
Vamos tentar o inotifywatch novamente, mas desta vez instruindo para monitorar esses dois eventos apenas. Execute este comando na primeira janela do terminal:
inotifywatch -v -e cria -e moved_to incoming
Na segunda janela ou aba do terminal, vamos tentar criar um novo arquivo , alterando seu conteúdo e, em seguida, movendo o arquivo de outro local para o diretório de destino. Todos esses comandos são executados a partir do diretório base.
toca no eco de entrada / criado Testing123 > > entrada / criação toque / tmp / created2 mv / tmp / created2 entrada /
Volte para a primeira janela do terminal e pare o inotifywatch pressionando CTRL + C. Veremos a seguinte saída:
Apenas dois eventos foram contados: criando um arquivo chamado "created.txt" e movendo um arquivo existente chamado "created2.txt". Todo o resto, como modificar "created.txt", foi ignorado.
Assistindo a um diretório e executando uma tarefa
Agora que sabemos quais eventos seguir, podemos usar outra ferramenta chamado inotifywait para bloquear a execução até que um arquivo seja criado ou movido para nosso diretório de destino. Usaremos os mesmos argumentos que fizemos com inotifywatch e também especificaremos como queremos que o nome do arquivo seja formatado para uso em nossa tarefa.
Antes de começar, precisamos de um diretório para armazenar arquivos que já tenham processado. Crie um diretório chamado “processado”:
mkdir processado
Em seguida, crie um novo script chamado “watch-incoming.sh” e adicione o conteúdo listado abaixo:
#! / bin / bash TARGET = ~ / incoming / PROCESSED = ~ / processado / inotifywait -m -e cria -e moved_to --format "% f" $ TARGET \ | enquanto ler FILENAME do echo Detectado $ FILENAME, movendo e fechando mv "$ TARGET / $ FILENAME" "$ PROCESSADO / $ FILENAME" gzip "$ PROCESSADO / $ FILENAME" concluído
O script executa o comando inotifywait com a opção -m. Isso faz com que o monitor de comando mude indefinidamente. Cada vez que um novo evento é detectado, o nome do arquivo é passado para o comando read e injetado na variável “FILENAME”. O bloco sob o loop while é executado, no qual o arquivo é movido primeiro para o diretório “processado” e então gzipado. O arquivo original é substituído pelo arquivo compactado e o nome do arquivo terminará em “.gz”.
Vamos conceder permissões de execução neste script e executá-lo em nosso diretório pessoal.
chmod u + x watch-incoming.sh ./watch-incoming.sh
Abra a segunda janela do terminal e crie um novo arquivo no diretório “incoming”. Liste o conteúdo dos diretórios “incoming” e “processed” para ver os resultados do evento sendo detectados:
O arquivo de texto bruto que nós copiamos para o arquivo de entrada. O diretório foi detectado pelo script, copiado para “processado” e comprimido usando gzip.
Podemos fazer algumas tarefas interessantes agora que podemos observar novos arquivos chegando em um diretório. Por exemplo, poderíamos adicionar uma marca d'água a arquivos de imagem, compactar vídeos brutos em formato mp4 e até carregar todos os novos arquivos que vemos em um bucket do Amazon S3. Esse script é um bom ponto de partida para criar seus próprios fluxos de trabalho e automatizar tarefas comuns em seu sistema.
Via: How to Geek
Nenhum comentário