• Publicidad

Renombrar los archivos de un directorio

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

Renombrar los archivos de un directorio

Notapor Alfumao » 2011-01-11 14:36 @650

Hola a todos,

Estaba intentando hacer un programa para renombrar todos los archivos de un directorio que tuvieran una extensión determinada. He hecho este programilla, pero sólo me los renombra en el archivo de texto que saco a modo de registro de cambios, los archivos del directorio continúan con el nombre del principio.
¿Me podéis echar una mano?

Código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/c:/Perl -w
  2. use strict;
  3.  
  4. print "Elige directorio:\n"; #Directorio donde renombrar
  5. chomp(my $path = <STDIN>);
  6. chdir $path;
  7. opendir (TEMP , "$path");
  8. my @nombres = readdir (TEMP);
  9.  
  10.  
  11. print "Elige nuevo nombre generico:\n"; #Nuevo nombre
  12. chomp(my $nuevo = <STDIN>);
  13.  
  14. print "Elige extension de archivos a renombrar\n"; #Tipo archivos a cambiar
  15. chomp(my $kind = <STDIN>);
  16.  
  17. open SALIDA, ">registro_cambios.txt" || die ("No pudo abrirse el archivo"); #Registro de cambios
  18.  
  19. my $head = 1;
  20.  
  21. for(@nombres){
  22.     if (/\.$kind$/){
  23.     my $antiguo = $_;
  24.     my $name = ("$nuevo"."$head"."."."$kind");
  25.     $head++;
  26.     rename ($antiguo, $name) ||die "Imposible renombrar" unless $antiguo eq $_;
  27.     print SALIDA ("$name\t\n");
  28. }
  29. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Renombrar los archivos de un directorio

Notapor explorer » 2011-01-11 14:45 @656

Quita

unless $antiguo eq $_

de la línea 26.
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: Renombrar los archivos de un directorio

Notapor Alfumao » 2011-01-11 14:55 @663

Hola de nuevo Explorer,
He hecho lo que me dijiste, pero sigue sin cambiarme el nombre de los archivos en el directorio, solo me los cambia en el archivo de registro...
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Renombrar los archivos de un directorio

Notapor explorer » 2011-01-11 15:02 @668

¿Puedes poner un ejemplo del registro de salida que te sale?

Estoy sospechando que el problema está en la combinación chdir() - readdir().
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: Renombrar los archivos de un directorio

Notapor Alfumao » 2011-01-11 15:11 @674

Hola de nuevo,

El registro de salida es tal que así (dando como "nombre genérico"-> Foto y como extensión a renombrar jpg):

Foto1.jpg
Foto2.jpg
Foto3.jpg
Foto4.jpg
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Renombrar los archivos de un directorio

Notapor explorer » 2011-01-11 15:33 @689

Bien, entonces el porqué no se renombra es porque a), chdir() no consigue entrar en el directorio indicado, o b) el usuario no tiene permisos para realizar esa operación.

Me inclino por la primera, ya que en caso de que chdir() hubiese logrado entrar en el directorio, opendir() habría fallado, salvo que le hubieras pasado como directorio una ruta absoluta.

Una forma de solventarlo sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. chdir $path or die "ERROR: No puedo entrar en $path: $!\n";  # entramos en el directorio
  2. opendir(TEMP, '.');                                          # leemos el directorio en donde estamos
  3. my @nombres = readdir (TEMP);                                # todas las entradas del directorio
  4. closedir TEMP;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $antiguo (@nombres) {
  2.     next if $antiguo !~ /\.$kind$/;                          # salta si no es una extensión que buscamos
  3.     my $name = "$nuevo$head.$kind";
  4.     rename ($antiguo, $name) or die "ERROR: Imposible renombrar $antiguo a $name: $!\n";
  5.     print SALIDA "$name\n";
  6.     $head++;
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 36 invitados