Advertisement
Guest User

hamacker

a guest
Aug 17th, 2009
1,494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.57 KB | None | 0 0
  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 cópia de pastas selecionadas para a unidade de destino
  11. #       compactando-os com gzip apenas quando a extensão do arquivo
  12. #       já não for um arquivo compactado, por exemplo, não faz sentido
  13. #       compactar um arquivo jpeg, avi ou mp3, pois todos eles já são
  14. #       arquivos compactados. O script tambem possui linhas de restrição,
  15. #       isto é, a variavel LISTA_NAO_SALVAR contem extensoes de arquivos
  16. #       temporarios que não devem ser copiados.
  17. #       Além disso, o arquivo mantém 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. #      espaço 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]  não 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 não foi informado."
  112.      return
  113.   fi  
  114.   if [ "$copiar_para_destino" = "" ] ; then
  115.      log "Erro na copia de arquivos : O endereco de destino não 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 não 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 não 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 não foi informado."
  205.      return
  206.   fi  
  207.   if [ "$copiar_para_destino" = "" ] ; then
  208.      log "Erro na copia de arquivos : O endereco de destino não 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, atenção 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 porém com alguns erros, verifique o log para saber quais são."
  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 esqueça 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, porém 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;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement