Como executar um comando quando o conteúdo de um diretório é atualizado?

22

Existe um diretório A cujo conteúdo é alterado com frequência por outras pessoas.

Eu fiz um diretório pessoal B onde guardo todos os arquivos que já existiram em A .

Atualmente, apenas ocasionalmente executo rsync para obter o backup dos arquivos de A para B . No entanto, temo a possibilidade de que alguns arquivos sejam adicionados em A e, em seguida, removidos de A antes que eu tenha a chance de copiá-los para B .

Qual é a melhor maneira de evitar que isso ocorra? Idealmente, gostaria que meu script de backup atual fosse executado toda vez que o conteúdo de A fosse alterado.

    
por oadams 06.11.2011 / 03:02

4 respostas

25

Se você tiver inotify-tools instalados você pode usar inotifywait para desencadear uma ação se um arquivo ou o diretório é escrito para:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Quando o interruptor -qq é completamente silenciosa, -r é recursiva (se necessário) e -e é o evento para monitorar, neste caso modify . De man inotifywait :

modify
A watched file or a file within a watched directory was written to.
    
por 06.11.2011 / 04:11
5

Estritamente falando, se alguém remover um arquivo e removê-lo rapidamente, você pode perder. O uso de inotify (no Linux, ou um recurso similar em outros unices) torna a janela de risco pequena.

Se você puder montar o sistema de arquivos de sua escolha nesse diretório (percebo que isso pode não ser uma opção), você pode colocar um que registre todas as versões de arquivo, por exemplo copyfs .

    
por 06.11.2011 / 18:24
4

Experimente a entr ferramenta de linha de comando que pode executar comandos arbitrários quando os arquivos são alterados. Desde a versão 2.9, uma opção de observação de diretório ( -d ) foi adicionada para reagir a eventos quando um novo arquivo é adicionado a um diretório.

Exemplo para executar o utilitário se um novo arquivo for adicionado ao projeto:

$ while true; do
> echo src/* | entr -d your_command
> done

In directory watch mode the parent directory of each file is implicitly added to the watch list.

A única implicação disso é que, se um novo arquivo aparecer, ele deve sair para permitir que um loop de shell externo verifique novamente o sistema de arquivos.

Aqui está a versão sem uma opção de monitoração de diretório:

$ while true; do
> echo src/* src | entr your_command
> done

Aqui está um exemplo mais simples, dependendo das suas necessidades:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Verifique: entrproject.org site para mais detalhes.

    
por 06.07.2016 / 19:15
3

O programa que você está procurando é inotify .

    
por 06.11.2011 / 03:23