Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Mover archivos y actualizar ruta reeplazando con expresiones regulares

Estas en el tema de Mover archivos y actualizar ruta reeplazando con expresiones regulares en el foro de Mysql en Foros del Web. Estimados: Es más una duda de expresiones regulares que de MySQL en sí. Trataré de ser lo más claro posible: Descripción del problema: En un ...
  #1 (permalink)  
Antiguo 02/07/2012, 11:24
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Mover archivos y actualizar ruta reeplazando con expresiones regulares

Estimados:

Es más una duda de expresiones regulares que de MySQL en sí. Trataré de ser lo más claro posible:

Descripción del problema:

En un CMS, mi cliente puede subir archivos e imágenes para vincularlos usando CKEditor y KCFinder, pero lamentablemente al cabo de los años, depositó centenares de archivos en la raíz de la carpeta donde se suben, haciendo que cada vez que se abra el KCFinder se tarde varios minutos en generar la lista, y a veces hasta causa un error 508 (Resource Limit Reached).

Por otro lado, hay otros cientos de archivos que sí están debidamente ubicados en carpetas.

Lo que quiero hacer es mover todos los archivos que estén en el directorio de subida, pero fuera de cualquier subdirectorio a una carpeta llamada, por ejemplo, "repositorio", pero sin mover las demás carpetas ya existentes. Esto es muy fácil de hacer, evidentemente.

La segunda parte sería actualizar vía MySQL todas las filas de una tabla llamada "secciones" donde en el campo "contenido" haya un MATCH de /file/archivo.ext para reescribirlo como /file/repositorio/archivo.ext pero que no afecte a archivos que estén en /file/carpeta-equis/archivo.ext o en /file/carpeta-ye/archivo.ext

Es un sitio enorme, y lo tengo que hacer bien y a la primera o mi cliente se infarta. Lamentablemente soy primerizo en expresiones regulares.

Como último recurso he pensado en mover todo a un subdirectorio y hacer un simple REPLACE, pero preferiría sólo mover los que estén en la raíz.

No tengo problema con la consulta, sólo con la expresión regular.

Espero haberme explicado. Cualquier ayuda será bien recibida.
  #2 (permalink)  
Antiguo 02/07/2012, 11:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mover archivos y actualizar ruta reeplazando con expresiones regulares

Usa REPLACE y mueve sólo los de la raíz.

Consejo de experiencia: Replica el site tal y como está en este momento, y trabaja con la réplica. Ni se te ocurra hacer la prueba directamente con el original, hasta estar seguro que la osa funciona.
Replicar y migrar te causará menos sobresaltos que meter la pata...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/07/2012, 11:52
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Respuesta: Mover archivos y actualizar ruta reeplazando con expresiones regulares

Gracias gnzsoloyo

Pero el problema es justamente que no doy con la expresión regular que haga match sólo con los que están en la raíz.

Lo que necesito es mover sólo los que están en la raíz y que al hacer el REPLACE no toque los que están en subdirectorios. ¿Me explico?

Por otro lado, seguiré tu consejo y respaldaré la base de datos antes de hacer los cambios. Pero respaldar el sitio completo no es factible (8Gb)
  #4 (permalink)  
Antiguo 02/07/2012, 12:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mover archivos y actualizar ruta reeplazando con expresiones regulares

Se me ocurre que es probable que si la ruta en la aplicación luego se crea en forma dnámica, es posible que lo que estén almacenados sean sólo los nombres de los archivos, ya que la cadena de la ruta inicial podría ser sólo algo como "../", que el sistema agregase al inicio.
En definitiva, si en la tabla debería aparecer la ruta a la carpeta personal, más el nombre del archivo, yo buscaría precisamente por aquellos archivos que carecen de ruta.
Una forma de hacerlo "a mano", sería ubicar el nombre de uno de los archivos y luego buscarlo dentro de la tabla con un
Código MySQL:
Ver original
  1. LIKE '%nombrearchivo'
.
Eso podría devolverte todas las apariciones del mismo nombre, y donde no vea una ruta específica, es que es raíz.
De todos modos yo comenzaría verificando los scripts, para ver cómo construyen la ruta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/07/2012, 14:38
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Respuesta: Mover archivos y actualizar ruta reeplazando con expresiones regulares

Gracias nuevamente.

Lo que tengo es una colección de cientos de archivos subidos por los usuarios usando CKEditor y KCFinder, así que tienen la libertad de subir los archivos a cualquier directorio dentro de la carpeta de imágenes.

El problema es que la mayoría los suben (por flojos) directo a la carpeta de imágenes y no a subdirectorios.

Así que tengo cerca de mil archivos con nombres variados y unas 20 carpetas en /raiz/

Lo que quiero es mover esos cientos de archivos a /raiz/algo/ sin mover las otras 20 carpetas.

Además, quiero poder reemplazar la ruta /raiz/*.jgp a /raiz/algo/*.jpg pero no a /raiz/unadelas20carpetas/*.jpg

Por tanto no puedo usar LIKE ni hacerlo manualmente.

Tiene que ser una expresión regular que encuentre todos los casos de /raiz/*.jpg y que ignore todos los casos donde haya más de un directorio involucrado. ¿Me explico?

Saludos :)
  #6 (permalink)  
Antiguo 02/07/2012, 19:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mover archivos y actualizar ruta reeplazando con expresiones regulares

Bueno, creo que no se terminó de entender mi propuesta, pero la idea es que si puedes detectar aquellas rutas almacenadas tales que eliminando la dirección de la carpeta raíz, no contengan más nombres de carpetas, tendrás el listado de archivos que sólo están en la raíz.
Mi planteo apuntaba a saber si la dirección de la raíz está contenida en las rutas almacenadas, porque si es así, la consulta (tomando tu ejemplo de "/raiz/") sería mas o menos así:
Código MySQL:
Ver original
  1. FROM archivos
  2. WHERE INSTR(MID(ruta, 7, LENGTH(ruta)-6), '/')=0;
Esto devuelve todos los registros donde la ruta almacenada, eliminando "/raiz/", no contenga ninguna barra (caracter típico de carpeta).
En cambio, si la ruta almacenada no contiene la cadena "/raiz/", sino sólo el nombre de carpeta+archivo, como por ejemplo: "carpeta/archivocualquiera.jpg", o si está en la raíz: "archivocualquiera.jpg), la consulta sería:
Código MySQL:
Ver original
  1. FROM archivos
  2. WHERE INSTR(ruta, '/')=0;

Lo importante es determinar qué partes comunes tienen las cadenas de las rutas en ambos casos, y eliminar esa usando la función adecuada.

¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: reg-ex, regex, replace
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:57.