• Publicidad

Ayuda con renombrar y comodin

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ayuda con renombrar y comodin

Notapor pablgonz » 2011-11-18 16:54 @746

Amigos del foro, estoy adaptando un script que funciona en Linux a Windows (para que trabaje en ambos). Tengo todo ok, pero me he topado con el siguiente problema:

Dentro del script hago una llamada al sistema operativo para que ejecute convert:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  system("convert $imageDir/$name-$imgNo.ppm  $imageDir/$name-$imgNo.png");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
donde $name-$imgNo.ppm ya está creado. En Linux, ningún problema: el archivo $name-$imgNo.ppm es creado por pdftoppm que está disponible en Linux y Windows, pero con una pequeña gran diferencia: al correrlo en Linux genera:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. name-tmp-1.ppm 
  2. name-tmp-2.ppm 
  3. name-tmp-3.ppm 
  4. ...........ppm 
  5. name-tmp-n.ppm 

pero al correrlo en Windows genera:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. name-tmp-000001.ppm 
  2. name-tmp-000002.ppm 
  3. name-tmp-000003.ppm 
  4. ...........ppm 
  5. name-tmp-00000n.ppm 
Es decir, los archivos generado por Linux y Windows sólo difieren en la cantidad de ceros que agrega antes del contador $imgNo.

Aquí es donde empieza mi consulta: ¿qué línea debo agregar en la llamada de sistema, para que ignore los ceros después del segundo guion hasta que llegue al contador? Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  system("convert $imageDir/$name-$noceros$$imgNo.ppm  $imageDir/$name-$imgNo.png");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

donde $noceros$ es un comodín (no sé cuál es la manera de llamarlo) que funciona sólo si existe estos benditos ceros.

De antemano, muchas gracias.
Última edición por pablgonz el 2011-11-24 18:59 @833, editado 3 veces en total
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Ayuda con system y comodín

Notapor explorer » 2011-11-18 18:18 @804

Si pones un comodín, entonces lo será para el shell que system() va a lanzar.

En situaciones normales, valdría con un '*', pero entonces convert puede interpretarlo como que quieres realizar la conversión de múltiples ficheros. Puedes intentar con otros comodines, pero pasará lo mismo: el shell los expandirá y pasará todos los ficheros, de golpe, a convert.

Otra solución sería hacer un recorrido por el directorio, por todos los ficheros *.ppm que hay dentro del directorio:

my @ficheros_ppm = <$imageDir/*.ppm>;

y ya tenemos todos los nombres de los ficheros, en $ficheros_ppm[0], $ficheros_ppm[1], etc.

Incluso se puede hacer más restrictivo:

my @ficheros_ppm = <$imageDir/$name-tmp-*.ppm>;

Otra solución... si sabes que el comportamiento es muy distinto entre sistemas operativos, puedes preguntarle a la variable especial $^O en qué sistema estás, y mostrar un comportamiento según sea.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con system y comodín

Notapor pablgonz » 2011-11-18 22:43 @988

explorer escribiste:Otra solución sería hacer un recorrido por el directorio, por todos los ficheros *.ppm que hay dentro del directorio:
my @ficheros_ppm = $imageDir/*.ppm;
...
my @ficheros_ppm = $imageDir/$name-tmp-*.ppm;
Lo intenté, pero, me lanza el mensaje de Bareword in... (lo volveré a revisar con más calma).

explorer escribiste: Otra solución... si sabes que el comportamiento es muy distinto entre sistemas operativos, puedes preguntarle a la variable especial $^O en qué sistema estás, y mostrar un comportamiento según sea.
También lo pensé. De hecho, lo haría desde la línea de comandos batch de win32, pero tratar de renombrar de esa manera en Windows... hasta la fecha no lo he logrado (de hecho pienso que no es posible), ¿no podría renombrar los archivos name-tmp-0000$imgNo.ppm dentro del script? Si es Linux, no hará nada (ya tendrán el nombre como corresponde) Si es win32 ¿aplicaría los cambios?

Agradecido por tus comentarios, seguiré intentando.
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ayuda con system y comodín

Notapor explorer » 2011-11-19 04:44 @239

pablgonz escribiste:
explorer escribiste:Otra solución sería hacer un recorrido por el directorio, por todos los ficheros *.ppm que hay dentro del directorio:
my @ficheros_ppm = $imageDir/*.ppm;
...
my @ficheros_ppm = $imageDir/$name-tmp-*.ppm;
Lo intenté, pero, me lanza el mensaje de Bareword in... (lo volveré a revisar con más calma).
No has puesto los '<' y '>'.

pablgonz escribiste:
explorer escribiste: Otra solución... si sabes que el comportamiento es muy distinto entre sistemas operativos, puedes preguntarle a la variable especial $^O en qué sistema estás, y mostrar un comportamiento según sea.
También lo pensé. De hecho, lo haría desde la línea de comandos batch de win32, pero tratar de renombrar de esa manera en Windows... hasta la fecha no lo he logrado (de hecho pienso que no es posible), ¿no podría renombrar los archivos name-tmp-0000$imgNo.ppm dentro del script? Si es Linux, no hará nada (ya tendrán el nombre como corresponde) Si es win32 ¿aplicaría los cambios?
Con la función rename(), en Perl, puedes renombrar (y en algún caso, hasta mover) ficheros, aunque depende un poco del sistema operativo en que estés. Por eso, se recomienda el uso de la función move() del módulo File::Copy.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con system y comodín

Notapor pablgonz » 2011-11-19 11:29 @520

explorer escribiste:No has puesto los '<' y '>'.
¡upss!, viejas costumbres... lo borré. Ahora que ya tengo los nombres de cada archivo .ppm, ¿cómo los llamo usando system()?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. system("convert $ficheros_ppm[...] /$name-$imgNo.png");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
no me funciona, no los llamo en forma correcta o no he capturado sus nombres o my @ficheros_ppm = $imageDir/$name-tmp-*.ppm; no guarda lo que necesito.

explorer escribiste: Con la función rename(), en Perl, puedes renombrar (y en algún caso, hasta mover) ficheros, aunque depende un poco del sistema operativo en que estés. Por eso, se recomienda el uso de la función move() del móduloFile::Copy.
El módulo File::Copy está cargado. Leí los temas http://perlenespanol.com/foro/usar-la-funcion-rename-t682.html y http://perlenespanol.com/foro/funcion-rename-regresa-error-permission-denied-t5047.html y al parecer debo abrir el directorio para luego hacer los cambios en el nombre de los benditos ficheros ppm, pero no sé cómo hacerlo.

¡Ahaaa!, explorer, ¿podrías mover el tema a http://perlenespanol.com/foro/script-perl-pst2pdf-y-pdftex-t5369.html? Al final es una duda que tengo después de modificar ese script.

Gracias por todo.
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ayuda con system y comodín

Notapor explorer » 2011-11-19 12:17 @553

Vamos a suponer que estamos trabajando en un directorio por encima de $imageDir.

Lo que queremos, es convertir los ficheros ppm a png.

Entonces, podemos hacer esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $fichero_ppm (<$imageDir/*.ppm>) {
  2.     (my $fichero_png = $fichero_ppm) = s/ppm$/png/i;
  3.     system("convert $fichero_ppm $fichero_png");         # conversión
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta manera, no nos preocupa cómo sean los nombres de los ficheros.
Simplemente, cogemos el nombre del fichero ppm, y le cambiamos la extensión ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con system y comodín

Notapor pablgonz » 2011-11-19 15:37 @692

Después de darle vueltas un rato, y revisando otros post del foro, recordé algo de suma importancia... no necesito llamar a convert si estoy en Windows, solo llamo a convert dentro del script si estoy en Linux, con una variable especial, y en Linux no me da problemas... :D

Con renombrar a los ficheros.ppm eliminando los ceros basta, luego ocupo
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. mogrify -format jpg *.ppm
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
así evito el problema de convert, ahora solo debo renombrar todos los name-tmp-00001.ppm a name-tmp-1.ppm y se acaba el problema.

Revisaré lo que escribiste arriba y comento cómo me va.

Gracias.
Última edición por pablgonz el 2011-11-19 20:35 @899, editado 1 vez en total
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ayuda con system y comodín

Notapor pablgonz » 2011-11-19 20:33 @898

Probé con la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $fichero_ppm (<$imageDir/*.ppm>)
  2. {
  3. (my $fichero_png = $fichero_ppm) = s/ppm$/png/i;
  4. system("convert $fichero_ppm $fichero_png");         # conversión
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero no me funcionó.

Creo que ya he acotado el problema y éste se reduce ha renombrar los archivos .ppm eliminando los ceros. Tengo dos ideas que podrían servir:
1.- Utilizar una llamada a sistema con «perl una línea» tipo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. rename $/imgDir/archivo-tmp-ceros$imgNo.ppm $/imgDir/archivo-noceros$imgNo.ppm
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
utilizando una expresión regular para cambiar los nombres, pero, no sé si va a funcionar, como está cargado File::Copy rename se comportará igual a la función en ren en Windows :( .
2.- Renombrar los archivos adaptando esto (es una idea adaptada de Google y el foro)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $drename = '$imgDir';
  2. opendir DIREN, $drename;
  3. @ppmfiles = readdir DIREN;
  4. chdir $drename;
  5. foreach $ppm (@ppmfiles) {
  6.  
  7.     # Variable con el nuevo nombre del archivo
  8.     $rnppm = $ppm;
  9.  
  10.     #Reemplazo
  11.     $rnppm = linea que elimina los ceros
  12.  
  13.         #renombramos cada archivo
  14.         rename $ppm, $rnppm;
  15. }
  16. closedir DIREN;
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero lo de abrir directorios está sobre mis capacidades Perl (por el momento). A mi parecer, creo que la segunda opción (más complicada) se podría adaptar a lo que necesito puesto que la llamada a system() ya no es necesaria (ya que dispongo de mogrify) para renombrar los archivos cuando estamos en win32 es la prioridad. Renombrado los archivo .ppm el problema estaría a un 99% solucionado y el script funcionará en win32 y Linux sin problemas.

Esperando sus comentarios.
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ayuda con system y comodín

Notapor pablgonz » 2011-11-20 10:08 @464

Después de leer la documentación de opendir y revisar lo que está en el foro creo tener una solución parcial a mi problema... solo necesito la expresión regular para eliminar los ceros. Va así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Renaming .ppm
  2. my $dir_renombra = "$tempDir/$imageDir";
  3. my $fichero = '';
  4. my $resultado = '';
  5. if(opendir(DIR,$dir_renombra)){
  6. #Leemos el listado de fichero que lo componen
  7.   foreach (readdir DIR){
  8.     $fichero = $_;
  9. #Seleccionamos los fichero que terminen en ppm y guardamos los que esta antes de los ceros
  10. if ($fichero =~ /(\w+\-tmp\-)\d+.ppm/){
  11.       my $nuevo_nombre = substr($fichero,0,-10) . "$IMGno.ppm";
  12.       $resultado = rename("$dir_renombra/$fichero","$dir_renombra/$nuevo_nombre");
  13.      print "Re nombrando $fichero a $nuevo_nombre: $resultado : $!\n";
  14. }
  15. }
  16. print "FIN\n";
  17. }
  18. else
  19. {
  20. print "no se abre ".$dir_renombra;
  21. }
  22. closedir DIR;
  23. # end renaming
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo adapté del hilo usar-la-funcion-rename-t682.html. Ahora debo restringir rename, para que solo coja los .ppm y elimine los ceros que me dan problemas. Así como está toma el último valor de $IMGno y se los agrega a todos los ficheros .ppm, arrojando el error «Inappropriate I/O control operation».

Debo reiniciar el contador pero no sé cómo hacerlo. Lo del error creo que es por donde hago substr, no sé si es la mejor manera, pues cuando terminé el ciclo, volverá tomar el primer archivo tratará de repetir la operación.

Esperando su ayuda para eliminar los bendito ceros... se despide.
Pablo.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ayuda con renombrar y comodin

Notapor pablgonz » 2011-11-21 20:18 @887

Creo que este es otro avance, ahora con el contador $var incluido
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dir_renombra = "$tempDir/$imageDir";
  2. my $fichero = '';
  3. my $resultado = '';
  4. my $var = 1;
  5. if(opendir(DIR,$dir_renombra))
  6. {
  7.   #Leemos el listado de fichero que lo componen
  8.   foreach (readdir DIR)
  9.   {
  10.     $fichero = $_;
  11.     #Seleccionamos los fichero que tengan un nombre con el formato *.ppm,    
  12.     if ($fichero =~ /($name-tmp-)\d+.ppm/)
  13.     {
  14.       next if $fichero=~/($name-tmp-$var).ppm/;
  15.                         my $nuevo_nombre = substr($fichero,0,-10) . "$var.ppm";
  16.                         $var = $var + 1;
  17.       $resultado = rename("$dir_renombra/$fichero","$dir_renombra/$nuevo_nombre");
  18.       print "Renombrando $fichero a $nuevo_nombre: $resultado : $!\n";
  19.     }
  20.   }
  21. print "FIN\n";
  22. }
  23. else
  24. {
  25.  print "no se abre ".$dir_renombra;
  26. }
  27. closedir DIR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Pero aún me arroja el error «Inappropriate I/O control operation». En teoría debería renombrar y avanzar al siguiente archivo. La primera vez que corro el script (con el directorio de $imageDir vacío) funciona, pero si lo vuelvo a correr, vuelve renombrar los archivos que ya estaban dentro del directorio, es decir sigue el ciclo con todo lo que pille .ppm, ¿qué es lo que estoy definiendo mal? Sigo pensando que estoy capturado mal el nombre de los ficheros que deseo renombrar y como los estoy renombrando en forma cíclica, me arroja el error I/O. Si alguien puede ayudarme con este dilema, se lo agradezco.

Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 22 invitados

cron