Sincronize dois diretórios sem rsync

1

Eu sei o que você está pensando agora " Basta usar o rsync " mas infelizmente este sistema não tem rsync, e eu gostaria de encontrar outra solução.

A configuração :

  1. O servidor de origem tem uma pasta de upload contendo 140 000+ arquivos (sem sub-diretórios)
  2. O servidor de destino precisa da pasta Upload que contém mais de 140.000 arquivos

Vamos chamá-lo de Migração com apenas Notas Post-It ... Agora, para complicar, o Servidor 1 continua recebendo novos arquivos todos os dias, devido a novos Uploads ou Miniaturas sendo gerados, então a idéia em sua cabeça agora " apenas copie o arquivo de 1 para 2 " não trabalho, como uma vez eu sou feito com a cópia de cerca de 20 + GB eu posso começar de novo, como já existe novo arquivo no servidor de origem ...

Minha ideia de solução

  • Copie a pasta completa da origem para o destino
  • Encontre a data de criação mais recente no servidor de destino e use como ponto de partida no servidor de origem
  • Copiar todos os arquivos desde a última data de criação da origem até o destino (delta)
  • Configure um cron para fazer isso com a maior frequência possível.

Meu problema

find /uploads/* -mtime -1 bash: /bin/find: Argument list too long

Agora, antes de começar a escrever um loop de script, eu queria saber se há alguém por aí que poderia sugerir outra maneira de fazer isso sem um script bash ... bom e velho CLI de baixo nível.

    
por Willem P. Botha 31.08.2016 / 13:35

1 resposta

0

Eu consegui encontrar uma solução, mas não em uma única linha ainda. Eu ainda estou trabalhando nisso.

Assumindo que você pode confiar na Data de Criação / Modificação do Sistema de Arquivos, pode-se usar find para gerar uma lista de arquivos, gerar isso em um arquivo de texto e então fazer um scp no servidor de destino. Eu não consigo obter o resultado da pesquisa diretamente para o scp corretamente.

Eu usei um programa de ajuda sshpass , mas seria melhor usar keyfiles, eu sei

find files in source Server from the destination Server and save the result limiting the result to only one directory and only files.

sshpass -p 'MyPassword' ssh [user@server] "find [path/to/look/in] -maxdepth 1 -mtime -1 -type f" > /tmp/last-24-hours-file-list.txt

Loop the output file and invoke scp per file

while read filename; do sshpass -p 'MyPassword' scp -Crpv [user@server]:$filename [path/to/save/to]; done < /tmp/last-24-hours-file-list.txt
    
por 05.09.2016 / 15:04