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 originalimport os
import re
def source(pattern_path):
pattern = re.compile(pattern_path)
def match(path):
m = pattern.match(path)
return m
return match
def destination(str_format):
"Format string with arguments recieved"
def format_path(match):
args = match.groups()
return str_format.format(*args)
return format_path
patterns = (
(source(r'^a/_img/_full/Pag(\d+)-full\.(png|jpg|gif)$'), destination('b/Pag{0}')),
(source(r'^a/_img/_thumb/Pag(\d+)-thumb\.(png|jpg|gif)$'), destination('b/Pag{0}')),
(source(r'^a/_img/Pag(\d+)/'), destination('b/Pag{0}/_img/Pag{0}')),
(source(r'^a/_css/Pag(\d+)\.css$'), destination('b/Pag{0}/_css')),
(source(r'^a/Pag(\d+)\.'), destination('b/Pag{0}')),
(source(r'^a/_template'), destination('b/Pag01/_template')),
(source(r'^a/_template'), destination('b/Pag02/_template')),
(source(r'^a/_template'), destination('b/Pag03/_template')),
)
# Kids, never ever indent this much
# It's just for fast programming sake
dir_tree = os.walk('a/')
for path, dirs, files in dir_tree:
for file_ in files:
full_path = os.path.join(path, file_)
for src, dst in patterns:
match = src(full_path)
if match:
command = 'mkdir -p %s' % (dst(match),)
print command
os.system(command)
command = "cp %s %s" % (full_path, dst(match))
print command
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).