Comparar pasta origem com pasta destino e copiar os arquivos que faltam

Publicado por nelio em 06/10/2008

[ Hits: 12.808 ]

 


Comparar pasta origem com pasta destino e copiar os arquivos que faltam



Estava com problemas para resolver este assunto no Linux, procurei muito na net, postei no fórum e não consegui uma resposta satisfatória. Então com auxílio de um livro consegui criar este script, que acredito ser de grande utilidade, uma vez que o rsync não me ajudou muito.

Caso achem que o código está muito poluído, retirem os comentários.

Para mim funcionou, pois meus arquivos sempre estarão na pasta origem e faltando na pasta destino, caso seja o contrário, aqui dá para ter uma boa idéia de como correr atrás.

ABS...

#!/bin/sh

#São necessários alterar apenas estas 3(três) variáveis

origem=/teste #Pasta de origem, altere /teste pelo caminho necessário
dest=/teste2 #Pasta destino, altere /teste2 pelo caminho necessário
arq_comp=/scripts/arq_compara #Arquivo criado para comparação entre as duas pastas, altere /scripts/arq_compara pelo caminho necessário

diff /$origem /$dest | cut -d: -f2 | cut -d" " -f2 > $arq_comp #Compara as duas pastas, recorte o que não interessa e deixe só o nome do arquivo e jogue para um arquivo de comparação que será lido durante a exec do programa

if test -s $arq_comp #Verifica se o arquivo de comparação está vazio.
then
while test -s $arq_comp #Caso não esteja, entra em loop para sincronismo
do
var=`head -1 $arq_comp` #Lê a primeira linha do arq de comparação e joga para uma variável temporária
cp $origem/$var /$dest #Copia o arquivo que falta da pasta origem para o dest.
sed -i '1d' $arq_comp #Elimina a primeira linha que foi lida do arquivo.
echo $var #Exibe a linha copiada
sleep 1 #Espera um seg. fique a vontade para comentar esta linha.
done #Fecha o Loop
rm -f $arq_comp #Apaga arquivo de comparação, não há problema se não apagar, pois será sobrescrita na próxima exec do programa
echo "Pastas sincronizadas com sucesso!!!" #Mensagem de sucesso, pode ser removida também
else
echo "Pastas já sincronizadas!!!" #caso os arquivos já estejam sincronizados, exibe esta mensagem
rm -f $arq_comp #Apaga arquivo de comparação temporário
fi
exit

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Rotacionando vídeos com o Mencoder

Acompanhando o (bash) shell script - debug

Letras Bacanas no seu Shell Script sem Figlet

Showterm: screencast pelo terminal

Caracteres Gráficos no Emulador de Dos

  

Comentários
[1] Comentário enviado por m4rc310 em 07/10/2008 - 10:07h

Por que você não usa "cp -u" ?

-u, --update
copy only when the SOURCE file is newer than the destination file or when the destination file is missing

Assim só é copiado quando o arquivo fonte é mais recente que o arquivo destino ou quando o aquivo destino não existe.

[2] Comentário enviado por neliobjr em 07/10/2008 - 11:07h

Pq fica muito simples e eu não gosto de coisas simples. rsrsrs

Pq o arquivo pode ser alterado na pasta origem, e não na pasta dest, e eu não quero que sobrescreva na pasta dest o arq alterado na pasta origem. E sim copie só os que faltam.

Agora se tiver uma opção, que copie só os que faltam sem alterar os que são mais recentes, fiz tudo em vão, mas desconheço.

[3] Comentário enviado por volcom em 09/09/2009 - 14:06h

Pode usar também o rsync:

rsync [opções] [origem] [destino]

rsync --help

ou

man rsync

Abraço!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts