SHARE
TWEET

hamacker

a guest Aug 17th, 2009 892 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. # Script desenvolvido por : hamacker <sirhamacker[em]gmail.com>
  3. # Data : 14/Ago/2009
  4. # Objetivo : Turbinar o backup e acabar com a necessidade de compactar
  5. #            pastas inteiras, compactando apenas os arquivos que h
  6. #            na pasta e mantendo a estrutura original de pastas da
  7. #            unidade de origem.
  8. # Uso : Faz backup de arquivos/pastas selecionadas para discos usb
  9. #       O importante neste script a funcao do_copy que faz
  10. #       a cpia de pastas selecionadas para a unidade de destino
  11. #       compactando-os com gzip apenas quando a extenso do arquivo
  12. #       j no for um arquivo compactado, por exemplo, no faz sentido
  13. #       compactar um arquivo jpeg, avi ou mp3, pois todos eles j so
  14. #       arquivos compactados. O script tambem possui linhas de restrio,
  15. #       isto , a variavel LISTA_NAO_SALVAR contem extensoes de arquivos
  16. #       temporarios que no devem ser copiados.
  17. #       Alm disso, o arquivo mantm a mesma estrutura do que era na origem, ex:
  18. #       Original :
  19. #       /home/fulano/planilhas/compras.xls
  20. #       /home/fulano/textos/poesias/minha-esposa.doc
  21. #       /home/fulano/musicas/mp3/testando-minha-voz.mp3
  22. #       Ficar assim na unidade de destino do backup (supondo que fosse em /media/usbdisk) :
  23. #       /media/usbdisk/home/fulano/planilhas/compras.xls.gz
  24. #       /media/usbdisk/home/fulano/textos/poesias/minha-esposa.doc.gz
  25. #       /media/usbdisk/home/fulano/musicas/mp3/testando-minha-voz.mp3
  26. #       Agora voce deve ter entendido o objetivo do script, fazer o backup de forma mais veloz
  27. #       e sem a necessidade de arquivos de logs que digam o que h dentro de cada .zip ou .tar.gz
  28. #       como seria necessario se fosse compactar as pastas inteiras
  29. # Modo de restaurar o backup :
  30. #      Os arquivos sao compactados com o gzip, assim basta usar um gunzip para descompacta-lo.
  31. #      Se voce quiser transformar os arquivos compactados em arquivos descompactaados
  32. #      de uma pasta/subpasta recursivamente, s executar:
  33. #      gunzip -r /local/da/pasta/onde/esta/o/backup
  34. #      e todos os arquivos que estiverem sido compactados com o gzip serao transformados em descompactados.
  35. #      Voce deve certificar-se antes de que o local onde estarao sendo transformados/descompactados tenha
  36. #      espao suficiente.
  37. #
  38. ############
  39. # funcoes  #
  40. ############
  41. function log() {
  42.   if [ -z "$1" ] ; then
  43.     echo "Parametro para log esta vazio"
  44.     return
  45.   fi
  46.   if [ -z "$backup_title" ] || [ "$backup_title" = "" ] ; then
  47.     backup_title="backup-`date +%Y-%m-%d`"
  48.   fi
  49.   if [ -z "$backup_file_log" ] || [ "$backup_file_log" = "" ] ; then
  50.     backup_file_log="/var/log/$backup_title.log"
  51.   fi  
  52.   if ! [ -f "$backup_file_log" ] ; then
  53.     echo "Arquivo para registrar log [$backup_file_log]  no existe !"
  54.     echo -ne "Criando um arquivo vazio..."
  55.     touch "$backup_file_log"
  56.   fi
  57.   echo "$1"
  58.   echo "$1" >>$backup_file_log
  59. }
  60.  
  61. function do_remover_acentuacao {
  62.   RETURN_STRING=""
  63.   ORIGINAL_STRING="$1"
  64.   NEW_STRING=""
  65.   SUBST_CHAR="_"
  66.   ACCEPT_CHARS="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!-_=+(){}[]\\,./"
  67.   if [ -f "/usr/bin/unaccent" ] ; then
  68.       NEW_STRING=`/usr/bin/unaccent UTF-8 "$ORIGINAL_STRING"`
  69.       if [ -z "$NEW_STRING" ] || [ "$NEW_STRING" = "" ] ; then
  70.         NEW_STRING="$ORIGINAL_STRING"
  71.       fi
  72.   fi
  73.   LEN=${#NEW_STRING}
  74.   POS=0
  75.   while [ $POS -le $LEN ] ; do
  76.    CHAR="${NEW_STRING:$POS:1}"
  77.    if [[ "$ACCEPT_CHARS" =~ "$CHAR" ]] ; then
  78.      RETURN_STRING="$RETURN_STRING$CHAR"
  79.    else
  80.      RETURN_STRING="$RETURN_STRING$SUBST_CHAR"
  81.    fi
  82.    POS=$((POS+1))
  83.   done
  84.   NEW_LEN=${#RETURN_STRING}
  85.  
  86.   if [ $LEN != $NEW_LEN ] ; then
  87.     RETURN_STRING="$ORIGINAL_STRING"
  88.   fi
  89. }
  90.  
  91. function do_copy() {
  92.   # copia uma pasta de um local de origem
  93.   # para um local de destino
  94.   # Porem faz a compactacao para o destino
  95.   copiar_de_origem="$1"
  96.   copiar_para_destino="$2"
  97.   RESULT_VALUE="OK"
  98.   LISTA_NAO_COMPACTAR=".7z .ace .ain .alz .apz .ar .arc .ari .arj .ark .axx .b64 .ba .bh .boo .bz .bz2 .bzip \
  99.  .bzip2 .c00 .c01 .c02 .car .cbr .cbz .cp9 .cpgz .cpt .dar .dd .deb .dgc .dist .ecs .efw \
  100.  .fdp .gca .gz .gzi .gzip .ha .hbc .hbc2 .hbe .hki .hki1 .hki2 .hki3 .hpk .hyp .ice .ipg \
  101.  .ipk .ish .j .jgz .jic .kgb .lbr .lemon .lha .lnx .lqr .lzh .lzm .lzma .lzo .lzx .md .mint \
  102.  .mpkg .mzp .p7m .package .pae .pak .paq6 .paq7 .paq8 .par .par2 .pbi .pcv .pea .pf .pim .pit \
  103.  .piz .pkg .pup .pup .puz .pwa .qda .r00 .r01 .r02 .r03 .rar .rev .rk .rnc .rpm .rte .rz .rzs \
  104.  .s00 .s01 .s02 .s7z .sar .sdc .sdn .sea .sen .sfs .sfx .sh .shar .shk .shr .sit .sitx .spt \
  105.  .sqx .sqz .tar .taz .tbz .tbz2 .tg .tgz .tlz .tz .uc2 .uha .vsi .wad .war .wot .xef .xez \
  106.  .xpi .xx .y .yz .z .z01 .z02 .z03 .z04 .zap .zip .zipx .zix .zoo .zz .jpg .png .gif .cab .exe .avi .mpg .mp3 .mp2 .aac"
  107.  
  108.   LISTA_NAO_SALVAR=".\$\$\$ .tmp .swp .lnk"
  109.  
  110.   if [ "$copiar_de_origem" = "" ] ; then
  111.      log "Erro na copia de arquivos : O endereco de origem no foi informado."
  112.      return
  113.   fi  
  114.   if [ "$copiar_para_destino" = "" ] ; then
  115.      log "Erro na copia de arquivos : O endereco de destino no foi informado."
  116.      return
  117.   fi
  118.   if ! [ -d  "$copiar_para_destino" ] ; then
  119.     mkdir -p "$copiar_para_destino"
  120.   fi
  121.  
  122.   # lendo todos os arquivos na pasta de origem e jogando para dentro de um arquivo temporario
  123.   temp=`mktemp`
  124.   find "$copiar_de_origem/" -type f >$temp
  125.   while read ARQ_ATUAL ; do
  126.     ARQ_ATUAL_PASTA=`dirname "$ARQ_ATUAL"`
  127.     NOME_ARQUIVO=`basename "$ARQ_ATUAL"`
  128.  
  129.     # entao remover a acentuacao que houver no nome de arquivo
  130.     do_remover_acentuacao "$NOME_ARQUIVO"
  131.     NOME_ARQUIVO="$RETURN_STRING"
  132.  
  133.     # Apenas nomes/extensoes de arquivos compactados em minusculo
  134.     NOME_ARQUIVO=`echo "$NOME_ARQUIVO" | tr [:upper:] [:lower:]`
  135.     NOME_ARQUIVO_EXT=${NOME_ARQUIVO#*.}
  136.     NOME_ARQUIVO_EXT=`echo "$NOME_ARQUIVO_EXT" | tr [:upper:] [:lower:]`
  137.  
  138.     # remover a acentuacao que houver no nome da pasta
  139.     do_remover_acentuacao "$copiar_para_destino/$ARQ_ATUAL_PASTA"
  140.     NOVA_PASTA="$RETURN_STRING"
  141.     # trocando //mnt por /
  142.     NOVA_PASTA=${NOVA_PASTA//\/\/mnt/\/}
  143.     # trocando //media/ por /
  144.     NOVA_PASTA=${NOVA_PASTA//\/\/media/\/}
  145.    
  146.     # As linhas a seguir vao determinar se havera compactacao ou se realmente
  147.     # necessario fazer o backup de tal arquivo
  148.     COMPACTAR_ARQUIVO="S"
  149.     SALVAR_ARQUIVO="S"
  150.    
  151.     # tratando arquivos que no devem ser salvos no backup
  152.     [[ "$LISTA_NAO_SALVAR" =~ "$NOME_ARQUIVO_EXT" ]] && SALVAR_ARQUIVO="N"
  153.     [[ "$ARQ_ATUAL" =~ "RECYCLER" ]] && SALVAR_ARQUIVO="N"
  154.     [ "$NOME_ARQUIVO" = "thumbs.db" ] && SALVAR_ARQUIVO="N"  
  155.    
  156.     # tratando de nomes de arquivos que no devem ser compactados
  157.     [ "$NOME_ARQUIVO" = "setup.exe" ] && COMPACTAR_ARQUIVO="N"
  158.     [ "$NOME_ARQUIVO" = "install.exe" ] && COMPACTAR_ARQUIVO="N"
  159.     [ "$NOME_ARQUIVO" = "instalar.exe" ] && COMPACTAR_ARQUIVO="N"      
  160.    
  161.     if [ "$SALVAR_ARQUIVO" = "S" ] ; then
  162.       ! [ -d "$NOVA_PASTA" ] && mkdir -p "$NOVA_PASTA"
  163.       [[ "$LISTA_NAO_COMPACTAR" =~ "$NOME_ARQUIVO_EXT" ]] && COMPACTAR_ARQUIVO="N"
  164.       if [  "$COMPACTAR_ARQUIVO" = "S" ] ; then
  165.         echo "[$NOME_ARQUIVO_EXT] transferindo [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO.gz]"
  166.         gzip -c "$ARQ_ATUAL" >"$NOVA_PASTA/$NOME_ARQUIVO.gz"
  167.         if [ $? -ne 0 ] ; then
  168.            log "[backup-falhou] : erro ao copiar [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO.gz]"
  169.            RESULT_VALUE="FALHOU"
  170.         fi
  171.       else
  172.         echo "[$NOME_ARQUIVO_EXT] transferindo [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO]"
  173.         cp  "$ARQ_ATUAL" "$NOVA_PASTA/$NOME_ARQUIVO"
  174.         if [ $? -ne 0 ] ; then
  175.            log "[backup-falhou] : erro ao copiar [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO]"
  176.            RESULT_VALUE="FALHOU"
  177.         fi
  178.       fi
  179.     fi
  180.   done < $temp
  181.   [ -f "$temp" ] && rm -f "$temp"
  182. }
  183.  
  184. function do_copy_7z() {
  185.   # copia uma pasta de um local de origem
  186.   # para um local de destino
  187.   # Porem faz a compactacao para o destino
  188.   copiar_de_origem="$1"
  189.   copiar_para_destino="$2"
  190.   if [ -z "$backup_title" ] || [ "$backup_title" = "" ] ; then
  191.     backup_title="backup-`date +%Y-%m-%d`"
  192.   fi
  193.   if [ -z "$backup_file_log" ] || [ "$backup_file_log" = "" ] ; then
  194.     backup_file_log="/var/log/$backup_title.log"
  195.   fi  
  196.   RESULT_VALUE="FALHOU"
  197.  
  198.   #### USANDO 7ZIP ####
  199.   COMPACTAR="/usr/bin/7z a -y -t7z -l -m0=lzma -mx=3 -mfb=64 -md=32m -ms=on -v100m "
  200.   COMPACTAR_EXT="7z"
  201.   COMPACTAR_CATALOGAR="/usr/bin/7z l "
  202.  
  203.   if [ "$copiar_de_origem" = "" ] ; then
  204.      log "Erro na copia de arquivos : O endehttp://pastebin.com/f73e5457creco de origem no foi informado."
  205.      return
  206.   fi  
  207.   if [ "$copiar_para_destino" = "" ] ; then
  208.      log "Erro na copia de arquivos : O endereco de destino no foi informado."
  209.      return
  210.   fi
  211.   if ! [ -d  "$copiar_para_destino" ] ; then
  212.     mkdir -p "$copiar_para_destino"
  213.   fi  
  214.  
  215.   unset backup_lista_subpasta
  216.   TEMP_FILE=`mktemp`
  217.   find $copiar_de_origem/* -maxdepth 0 -type d >$TEMP_FILE
  218.   while read PASTA_ATUAL ; do
  219.     backup_lista_subpasta=( "${backup_lista_subpasta[@]}" "$PASTA_ATUAL" )
  220.   done < $TEMP_FILE
  221.  
  222.   for copiar_de_origem in "${backup_lista_subpasta[@]}" ; do
  223.     # se tiver instalado o programa /usr/bin/unaccent entao removo o acento
  224.     # no nome do arquivo compactado
  225.     if [ -f "/usr/bin/unaccent" ] ; then
  226.       backup_file=`/usr/bin/unaccent UTF-8 "$copiar_de_origem"`
  227.     else
  228.       backup_file="$copiar_de_origem"
  229.     fi
  230.  
  231.     # Apenas nomes compactados em minusculo
  232.     backup_file=`echo "$backup_file" | tr [:upper:] [:lower:]`
  233.    
  234.     # trocando // por servidor_ (caso de a origem for um endereco smb //server/compartilhamento)
  235.     if [ "${backup_file:0:2}" = "//" ] ; then
  236.       backup_file=${copiar_de_origem//\/\//servidor_}
  237.     else
  238.       # removendo o primeiro "/" do endereco para compor o nome nome
  239.       if [ "${backup_file:0:1}" = "/" ] ; then
  240.         backup_file=${backup_file:1}
  241.       fi
  242.     fi
  243.     # trocando / por :
  244.     backup_file=${backup_file//\//:}
  245.     # trocando :mnt: por nada
  246.     backup_file=${backup_file//:mnt:/}
  247.     # trocando :media: por nada
  248.     backup_file=${backup_file//:media:/}
  249.     # trocando : por _
  250.     backup_file=${backup_file//:/_}
  251.     # acrescentando o caminho completo
  252.     backup_file="$copiar_para_destino/$backup_title-$backup_file.$COMPACTAR_EXT"
  253.     # instrucao para realizacao do backup, o algarismo "2" no final da linha
  254.     # ira redirecionar mensagens de erro (stderr) para o arquivo de log, ateno que
  255.     # nem todos os compactadores enviam mensagens de erro para strerr, o caso
  256.     # do programa zip
  257.     $COMPACTAR "$backup_file" "$copiar_de_origem" 2>>$backup_file_log
  258.     # verificando se ouve erro
  259.     if [ $? -ne 0 ] ; then
  260.        RESULT_VALUE="FALHOU"
  261.        log "Backup de [$copiar_de_origem] completado porm com alguns erros, verifique o log para saber quais so."
  262.     else
  263.        log "Backup de [$copiar_de_origem] completado com sucesso."
  264.        RESULT_VALUE="OK"
  265.     fi
  266.     if [ -f "$backup_file" ] || [ -f "$backup_file.001" ] ; then
  267.        # Catalogando o arquivo de backup recem-criado
  268.        [ -f "$backup_file" ] && $COMPACTAR_CATALOGAR "$backup_file" >"$backup_file.txt"
  269.        [ -f "$backup_file.001" ] && $COMPACTAR_CATALOGAR "$backup_file.001" >"$backup_file.txt"
  270.     fi
  271.   done
  272. }
  273.  
  274. ############################
  275. # Inicio do Programa       #
  276. ############################
  277. backup_title="backup-`date +%Y-%m-%d`"
  278. backup_file_log="/var/log/$backup_title.log"
  279. if ! [ -d "`dirname $backup_file_log`" ] ; then
  280.   mkdir -p "`dirname $backup_file_log`"
  281. fi
  282.  
  283. # local de destino do backup
  284. # se for uma unidade usb, nao esquea de monta-la primeiro
  285. destino="/media/disk"
  286.  
  287. # lista de pastas a serem backupeadas
  288. # basta duplicar uma linha para acrescentar novas pastas
  289. # para serem backupeadas
  290. unset backup_lista
  291. backup_lista=( "${backup_lista[@]}" "/home/fulano" )
  292. backup_lista=( "${backup_lista[@]}" "/home/fulano/.ecryptfs" )
  293. backup_lista=( "${backup_lista[@]}" "/home/fulano/.mozilla" )
  294. backup_lista=( "${backup_lista[@]}" "/home/dados" )
  295. backup_lista=( "${backup_lista[@]}" "/var/cache/apt/archives" )
  296. # realizando o backup dos volumes alistados acima
  297. # use do_copy para fazer o backup com compactacao individual de arquivos,
  298. # ou use do_copy_7z para fazer o backup com compactacao por pastas
  299. for origem in "${backup_lista[@]}" ; do
  300.   do_copy_7z "$origem" "$destino"
  301.   if [ "$RESULT_VALUE" != "OK" ] ; then
  302.     echo "Backup feito, porm com falhas !"
  303.   else
  304.     echo "Backup feito com sucesso !"
  305.   fi
  306. done
  307. log "Se precisar consultar mensagens de erro, veja [$backup_file_log]."
  308. exit 0;
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top