Copie novos arquivos de uma pasta monitorada para outra no debian

3

Eu tenho diretório a e diretório b. Diretório a tem novos arquivos e pastas copiados para ele periodicamente. Eu gostaria de monitorar a pasta a para esses novos arquivos e copiá-los automaticamente para a pasta b. Infelizmente, devido a alguns scripts organizacionais que eu configurei anteriormente no diretório b me impedem de usar o rsync para esses propósitos, uma vez que a estrutura da pasta no destino provavelmente seria muito diferente entre as execuções do rsync.

Existe algum tipo de configuração alternativa que eu possa usar?

    
por user275451 20.11.2013 / 05:51

2 respostas

4

Outra maneira de fazer isso seria usar inotify :

  1. Instale o pacote inotify-tools

    sudo apt-get install inotify-tools
    
  2. Escreva um pequeno script que use inotifywatch para verificar se há alterações na sua pasta e mova todos os novos arquivos para o diretório de destino:

    #!/usr/bin/env bash
    
    ## The target and source can contain spaces as 
    ## long as they are quoted. 
    target="/path/to/target dir"
    source="/path to/source/dir";
    
    while true; do 
    
      ## Watch for new files, the grep will return true if a file has
      ## been copied, modified or created.
      inotifywatch -e modify -e create -e moved_to -t 1 "$source" 2>/dev/null |
         grep total && 
    
      ## The -u option to cp causes it to only copy files 
      ## that are newer in $source than in $target. Any files
      ## not present in $target will be copied.
      cp -vu "$source"/* "$target"/
    done
    
  3. Salve esse script no seu $PATH e torne-o executável, por exemplo:

    chmod 744 /usr/bin/watch_dir.sh
    
  4. Ele é executado toda vez que sua máquina é reinicializada, crie um crontab ( crontab -e , conforme descrito na resposta do @MariusMatutiae e adicione esta linha a ela:

    @reboot /usr/bin/watch_dir.sh 
    

Agora, toda vez que você reinicializar, o diretório será automaticamente assistido e novos arquivos serão copiados da origem para o destino.

    
por 20.11.2013 / 13:57
1

Você pode configurar um trabalho de crontab para executar a cada N minutos. O trabalho pesquisará arquivos modificados há menos de N minutos e os copia para o novo destino.

Por exemplo, se você deseja executar o arquivo / home / my_name / bin / custom a cada 10 minutos, edite seu arquivo crontab por meio do comando

 crontab -e

e adicione a seguinte linha no final:

 */10 * * * * /home/my_name/bin/custom

O arquivo personalizado, tornado executável por

 chmod 755 custom

poderia ser algo assim:

 #!/bin/sh

 cd /directory/to/be/monitored
 find . -type f -mmin -10 -exec sh -c ' file={}; base=${file##*/}; \
 scp {} me@remotemachine:/target/directory/$base ' \;

Esse comando pesquisa recursivamente o diretório de destino para arquivos modificados com menos de (-mmin -10) dez minutos atrás e s -coloca-os para o novo destino. Ele coloca todos os arquivos no mesmo diretório / target / directory, independentemente de sua origem. Você deve ter um login sem senha para que isso funcione, é claro.

Se, em vez disso, você desejar manter a estrutura de diretórios (ou seja, não empilhar tudo no mesmo diretório, modifique o procedimento acima da seguinte maneira:

 find . -type f -mmin -10 -exec sh -c ' file={}; base=${file##*/};  \
 dirpath=${file%/*}; ssh me@remotemachine mkdir -p /target/directory/$dirpath ; \ 
 scp {} me@remotemachine:/target/directory/{} ' \;

Não há verificação de erros aqui, modifique como achar melhor.

    
por 20.11.2013 / 13:28