passa2 - Um sistema de backup/sincronização/cópia de arquivos em SHell Script
Publicado por Marcelo 22/11/2008
[ Hits: 6.762 ]
Homepage: sites.google.com/sites/foo4funreborn/
Este script automatiza a cópia de diretórios e arquivos para um pendrive (ou pasta) organizando-os por data e nome do host. Ele permite arquivar e restaurar tentando manter sempre a mesma estrutura de arquivos. Exemplo:
passa2 -config (na máquina 1)
passa2 -saveit /home/mbianchi/projetos/tese (na máquina 1)
passa2 -restore (na máquina 2)
#!/bin/bash ########################################################################## # This file is in UTF-8 # Este arquivo esta formatado em UTF-8 # Writen by Bianchi @ 2008 under GPL ## ##### Changelog # #0.5.0 - 31/08/2008 # # - Added the machine part to identify # in which machine the tar was created. # #0.3.0 - 15/03/2008 # # - Changed archive method. The tar file is created compressed directly on the pendrive # the info file is created at the directory that you invoked the passa2 script. # # - Every change and comments and user interaction should be made in english to give # a little chance for other people to use it. # # - Removed the option to compress the tar file, the file from now on are always compressed # with gzip # # - Added pre-startup check of need binaries # #0.2.7 - Sem chanelog .... ##### function about() { cat << EOF Passa2 - Version 0.5 Modo de Uso: passa2 [options] [FILE||DIRECTORY] Opções: -h|-about - Sobre (esta ajuda) -saveit - Salva um arquivo ou diretório para o diretório de arquivo -restore - Restaura um arquivo do diretório de arquivo -list - Lista os arquivos disponíveis no diretório de arquivos -config - Configura o script EOF } function termina() { #Final echo -e "\nI:> Done !" exit } function inicializa() { ans="" while [ ! -d "$ans" ] do echo "Entre com o nome do diretório a ser usado para arquivo ?" read ans export destd=$ans done } function loadconfig() { export v=0 for i in gzip gunzip tar mktemp awk sed cut basename dirname do [ ! -x "`which $i`" ] && echo "No $i program, can't run." && exit [ $v -eq 1 ] && echo "$i pronto !" done if [ -f ~/.passa2rc ] then source ~/.passa2rc else echo "Ooops sem arquivo de configuração." inicializa saveconfig loadconfig fi [ "Z$destd" = "Z" ] && echo "Diretório de transporte não definido, run config !" && exit [ ! -d $destd ] && echo "Diretório de transporte ($destd) não existe !" && exit } function saveconfig() { echo "export destd=$destd" > ~/.passa2rc } function getlistoffiles() { if [ "Z`ls -1 $destd/`" != "Z" ] then ls -1 $destd/* | sort fi } function listfiles() { n=1 echo -e "\n\e[0;31;1mArquivos existentes:\e[m" for i in `getlistoffiles` do nome=`basename $i .tar.gz` tamanho=`du -hs $i| awk '{print $1}'` ref=`echo $nome | awk -F"_" '{ if (NF == 3) {print $3} else {print $2}}'` machine=`echo $nome | awk -F"_" '{ if (NF == 3) {print $2} else {print "---"}}'` data=`echo $nome | awk -F"_" '{print $1}'` ano=`echo $data | cut -c1-4` dia=`echo $data | cut -c7-8` mes=`echo $data | cut -c5-6` hora=`echo $data | cut -d"-" -f 2 | awk '{print substr($1,1,2)":"substr($1,3,2)":"substr($1,5,2)}'` echo -e "\e[0;34;1m $n:\e[m $ref\t ($dia/$mes/$ano)-($hora) [$tamanho] (\e[0;32;1m${machine}\e[m) " n=$(( n + 1 )) done } ############## Real begin ######################################################################################### ######################################################################################### if [ "Z$1" = "Z-h" -o "Z$1" = "Z-about" ] then about termina fi ######################################################################################### ######################################################################################### if [ "Z$1" = "Z-config" ] then inicializa saveconfig loadconfig termina fi ######################################################################################### ######################################################################################### # Configuração Inicial, carregando preferencias loadconfig ######################################################################################### ######################################################################################### if [ "Z$1" == "Z-list" ] then listfiles termina fi ######################################################################################### ######################################################################################### if [ "Z$1" == "Z-saveit" ] then shift element=$1 if [ "Z$element" == "Z" ] then echo "Elemento não é válido !" exit fi from=`dirname $element` fromfilename=`basename $element` cd $from [ $? -eq 0 ] && realfrom=`pwd` || exit cd $realfrom # We do not accept .... [ -L $fromfilename ] && type="link" && echo "I:> Elemento é um dispositivo tipo LINK !" && exit [ -c $fromfilename ] && type="char" && echo "I:> Elemento é um dispositivo tipo CHAR !" && exit [ -b $fromfilename ] && type="block" && echo "I:> Elemento é um dispositivo tipo BLOCK!" && exit [ -p $fromfilename ] && type="pipe" && echo "I:> Elemento é um dispositivo tipo PIPE !" && exit # We accept ... [ -d $fromfilename ] && type="dir" && echo "I:> Elemento é um directório !" [ -f $fromfilename ] && type="file" && echo "I:> Elemento é um arquivo !" #Data do arquivo data=`date +%Y%m%d-%H%M%S` #Nome da máquina machine=`uname -n` if [ "Z${machine}" == "Z" ] then machine="UNK" fi #Gerando arquivo de informações (filesystem) export TMPDIR=. tmfile=`mktemp` unset TMPDIR cat << EOF > $tmfile #PASSA2AT export from=$from export fromfilename=$fromfilename export realfrom=$realfrom export type=$type export data=$data export machine=$machine EOF #Nome do arquivo tar tarfile=$destd/${data}_${machine}_${fromfilename}.tar.gz #Add the info file + path echo -e "I:> Adicionando ... \n" tar cvf - $tmfile $fromfilename | gzip -c > $tarfile #erasing tmfile rm $tmfile termina fi ######################################################################################### ######################################################################################### if [ "Z$1" == "Z-restore" ] then listfiles echo -n "Extract which file: " read ans f=`getlistoffiles | head -n $ans | tail -1` f=`basename $f` [ ! -f $destd/$f ] && echo "Where is the file: $f ?" && exit tempd=`mktemp -d` [ $? -ne 0 ] && echo "Error criating the temporary directory !" && exit echo "" echo "I:> Restoring: $f" cd $tempd 2> /dev/null [ $? -ne 0 ] && echo "Where is the temporary directory?" && exit echo "I:> Extracting" gunzip -c $destd/$f | tar xf - # Lendo o index indexfile=`ls -1 tmp.??????????` [ "Z$indexfile" == "Z" -o ! -f ${indexfile} ] && echo "Can't find index file" && exit echo -n "I:> Index file is: $indexfile: " if [ "Z`sed -ne '1p' $indexfile`" != "Z#PASSA2AT" ] then echo "Fail in `pwd`." exit else echo "Ok." source $indexfile echo " I:> Restaurando em: ($from) objeto: ($fromfilename) tipo: ($type)" fi if [ -d $realfrom ] then echo "I:> Usando caminho real: $realfrom" cd $realfrom else if [ -d $HOME/$from ] then echo " I:> Usando caminho absoluto de $HOME/$from" cd $HOME/$from else echo " E:> Não sei onde restaurar." echo " I:> OP1 -> $HOME/$from Não Existe." echo " I:> OP2 -> $realfrom Não Existe." echo " I:> Arquivo foi extraido em: $tempd, saindo agora." exit fi fi case "$type" in dir) echo " I:> Restaurando diretório: ($fromfilename)." if [ -e $fromfilename ] then echo " E:> Objeto existe, o que fazer?" echo " I:> Arquivo foi extraido em: $tempd, saindo agora." exit else res=`mv $tempd/$fromfilename . 2>&1` if [ $? -eq 0 ] then rm -rf $tempd echo -e " I:> Restauração concluida.\n" ls -l1d $fromfilename else echo " E:> Restauração falhou." echo " I:> Comando mv não conseguio mover de: $tempd/$fromfilename para `pwd`" echo " L:> Erro retornado pelo comando:" echo " $res" echo " I:> Arquivo foi extraido em: $tempd, saindo agora." exit fi fi ;; file) echo "Não sei restaurar arquivos." ;; *) echo "Opa !! Nao deveria acontecer tipo '*'." exit ;; esac termina fi ######################################################################################### ######################################################################################### # Você não forneceu nenhuma opção (mostrando a ajuda) about
Distribuindo arquivos para máquinas em rede
Configurando CISCO por Shell Script
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (2)
Preciso resolver um erro de DPKG (0)
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta