passa2 - Um sistema de backup/sincronização/cópia de arquivos em SHell Script
Publicado por Marcelo 22/11/2008
[ Hits: 7.017 ]
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
cg_ext - script para alteração de extensão de arquivos em larga escala
sync2test - sincroniza arquivos do subversion
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









