Ver Mensaje Individual
  #4 (permalink)  
Antiguo 08/10/2012, 23:13
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Cómo puedo hacer este empaquetador?

No necesitas tanta recursividad. Para hacer este "simple" script.

Imagina que estas en alguna carpeta, y dentro de esa carpeta tienes una carpeta que llamaremos 'a' donde tienes la siguiente estructura.

Código:
a
├── _css
│** └── Pag01.css
├── _img
│** ├── _full
│** │** ├── Pag01-full.png
│** │** ├── Pag02-full.png
│** │** └── Pag03-full.png
│** ├── Pag01
│** │** ├── background.png
│** │** └── logo.jpg
│** ├── Pag02
│** │** └── header.png
│** └── _thumb
│**     ├── Pag01-thumb.png
│**     ├── Pag02-thumb.png
│**     └── Pag03-thumb.png
├── Pag01.html
├── Pag02.html
├── Pag03.pdf
└── _template
    ├── config.js
    └── style.css
Lo que hice para resolver este problema es muy sencillo (inspirado en el URLConf de Django):
Recorro los archivos y por cada archivo, reviso la lista de patrones, si llega a coincidir con un patrón entonces en base a ese patrón se formatea un nuevo destino a donde va a ser copiado.

Es un script rápido (mas o menos 2 - 3 horas) que hice:
Código Python:
Ver original
  1. import os
  2. import re
  3.  
  4. def source(pattern_path):
  5.     pattern = re.compile(pattern_path)
  6.     def match(path):
  7.         m = pattern.match(path)
  8.         return m
  9.     return match
  10.  
  11. def destination(str_format):
  12.     "Format string with arguments recieved"
  13.     def format_path(match):
  14.         args = match.groups()
  15.         return str_format.format(*args)
  16.     return format_path
  17.  
  18. patterns = (
  19.     (source(r'^a/_img/_full/Pag(\d+)-full\.(png|jpg|gif)$'), destination('b/Pag{0}')),
  20.     (source(r'^a/_img/_thumb/Pag(\d+)-thumb\.(png|jpg|gif)$'), destination('b/Pag{0}')),
  21.     (source(r'^a/_img/Pag(\d+)/'), destination('b/Pag{0}/_img/Pag{0}')),
  22.     (source(r'^a/_css/Pag(\d+)\.css$'), destination('b/Pag{0}/_css')),
  23.     (source(r'^a/Pag(\d+)\.'), destination('b/Pag{0}')),
  24.     (source(r'^a/_template'), destination('b/Pag01/_template')),
  25.     (source(r'^a/_template'), destination('b/Pag02/_template')),
  26.     (source(r'^a/_template'), destination('b/Pag03/_template')),
  27. )
  28.  
  29. # Kids, never ever indent this much
  30. # It's just for fast programming sake
  31. dir_tree = os.walk('a/')
  32. for path, dirs, files in dir_tree:
  33.     for file_ in files:
  34.         full_path = os.path.join(path, file_)
  35.         for src, dst in patterns:
  36.             match = src(full_path)
  37.             if match:
  38.                 command = 'mkdir -p %s' % (dst(match),)
  39.                 print command
  40.                 os.system(command)
  41.                
  42.                 command = "cp %s %s" % (full_path, dst(match))
  43.                 print command
  44.                 os.system(command)

Una vez que corre el script al mismo nivel de la carpeta 'a' obtengo una carpeta hermana llamada 'b'.

Con la siguiente estructura:
Código:
b/
├── Pag01
│** ├── _css
│** │** └── Pag01.css
│** ├── _img
│** │** └── Pag01
│** │**     ├── background.png
│** │**     └── logo.jpg
│** ├── Pag01-full.png
│** ├── Pag01.html
│** ├── Pag01-thumb.png
│** └── _template
│**     ├── config.js
│**     └── style.css
├── Pag02
│** ├── _img
│** │** └── Pag02
│** │**     └── header.png
│** ├── Pag02-full.png
│** ├── Pag02.html
│** ├── Pag02-thumb.png
│** └── _template
│**     ├── config.js
│**     └── style.css
└── Pag03
    ├── Pag03-full.png
    ├── Pag03.pdf
    ├── Pag03-thumb.png
    └── _template
        ├── config.js
        └── style.css
Sientete libre de modificar el script para que cubra tus necesidades.

PD: Este script esta atado al sistema operativo en este caso ubuntu, para hacerlo correr en windows necesitas cambiar las llamadas al sistema (osea los comandos).