• Publicidad

Función rename() regresa error "Permission denied"

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

Función rename() regresa error "Permission denied"

Notapor szenteno » 2010-04-27 11:17 @512

Hola:

Estoy intentando renombrar los archivos de una carpeta. Cada archivo tiene las iniciales de una persona en los primeros dos caracteres y el nombre de un gen en los siguientes (ejemplo: "DA PDK4.afa"), y los archivos tienen diferentes extensiones. Sólo quiero renombrarlos para que el nombre del gen aparezca primero y después el de las iniciales de la persona.

Éste es mi código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Getopt::Long;
  5.  
  6. my $archivos;
  7. my @file;
  8. my $persona;
  9. my $gen;
  10. my $nombre;
  11. my $extension;
  12. my %opts = ();
  13.  
  14. GetOptions (\%opts,                            
  15.                    'd=s',              
  16.                    'o=s',                      
  17.                    'help|h');                                  
  18.  
  19. opendir (DIR, "$opts{d}") or die "No se pudo abrir el directorio $opts{d}: $!";
  20.         @file= readdir (DIR);  
  21. closedir(DIR);                                         
  22.  
  23. @file=sort(@file);
  24.  
  25. foreach $archivos (@file){                                     
  26.         $persona=substr(uc($archivos), 0, 2);
  27.         $gen=substr(uc($archivos), 3, -4);
  28.         $extension= substr($archivos, -4);
  29.         $nombre="$gen $persona$extension";
  30.         print "$archivos $nombre\n";
  31.         rename($archivos, $nombre) || die "Cannot rename: $!";
  32.         }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero cuando lo corro me aparece:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Cannot rename: Permission denied at (....)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No sé a qué se deba ésto, o cómo puedo abrir los permisos, porque lo estoy corriendo en Windows y no tengo ninguno de los archivos que quiero renombrar abiertos o nada por el estilo.

Apreciaría mucho que me pudieran ayudar porque me urge tener éstos archivos en orden y son de verdad muchos como para empezar a hacerlo a mano.
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Publicidad

Re: Función rename() regresa error "Permission denied"

Notapor explorer » 2010-04-27 11:27 @519

Bienvenido a los foros de Perl en Español, szenteno.

Sospecho que el problema está en que no estás trabajando en el directorio correcto.

Cuando usas opendir(), le estás pidiendo el listado de los ficheros que están en ESE directorio, pero TÚ estás en OTRO directorio. Al hacer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        rename($archivo, $nombre);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
lo estás ejecutando en TÚ directorio, NO en el directorio donde reside el $archivo.

Tienes dos soluciones.

1.- Antes del bucle, haces un chdir() al directorio $opts{d}, y trabajas allí mismo (opendir(".")). Esta es la solución más cómoda, rápida, aconsejable, etc., o

2.- Cambias la línea anterior por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        rename("$opts{d}/$archivo", "$opts{d}/$nombre");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¿Ves? Estamos indicando la ruta completa a los ficheros.
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: Función rename() regresa error "Permission denied"

Notapor szenteno » 2010-04-27 11:51 @535

Hola, de nuevo, y gracias por la bienvenida.

Ya cambié lo del chdir() antes del foreach() y me sigue apareciendo el mismo error, y también agregué el $opts{d} antes de cada parámetro de la función rename() y de todas maneras me sigue apareciendo lo mismo.

¿Qué más puedo intentar?
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Re: Función rename() regresa error "Permission denied"

Notapor explorer » 2010-04-27 12:04 @544

Pues... ni idea...

Google me dice que, o bien no tienes permisos para escribir o están abiertos...

Aunque... una cosa que no me gusta es lo del espacio en blanco, en el nombre.

¿No podrías hacer una prueba, sin ese espacio en blanco?

Yo, como no uso Windows, no sé decirte si será eso, pero recuerdo que en MSDOS, cuando querías trabajar en línea de comandos con un fichero que tenía un espacio en blanco, tenías que entrecomillarlo doble.
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: Función rename() regresa error "Permission denied"

Notapor szenteno » 2010-04-27 12:11 @549

Mmmmmm.... no, con o sin el espacio, es lo mismo, ya lo intenté.
¿No sabes cómo puedo activar los permisos?

De cualquier forma gracias, creo que me jor empezaré a hacerlo de la forma manual.

Gracias.
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Re: Función rename() regresa error "Permission denied"

Notapor explorer » 2010-04-27 12:22 @557

No, no tengo idea de cómo funcionan los permisos en Windows, además de que depende de cada versión de Windows.

Puedes hacer una prueba.

Crea un fichero "A" en el directorio donde están los demás ficheros.

Desde la línea de comandos, prueba
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -e "rename 'A', 'B';"
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


A ver qué pasa.
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: Función rename() regresa error "Permission denied"

Notapor szenteno » 2010-04-27 12:30 @562

Sí, sí, le cambió el nombre, qué raro, entonces, ¿por qué no querrá cambiar los otros?
Le cambia el nombre tanto si es una carpeta como si es un .txt, ¿qué significa eso?
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Re: Función rename() regresa error "Permission denied"

Notapor explorer » 2010-04-27 14:14 @635

Una vez que has probado que rename() funciona, intenta hacer lo mismo, pero con un fichero de los originales del directorio, a ver si sale o no el error.

Si sale, es que hay un problema con los permisos (aunque empiezo a dudar que sea eso. Lee el final del mensaje).

Si no sale, es que quizás al programa le falta algún detalle... yo lo modificaría así...

Primero, hacer un chdir(), y hago un listado (en pantalla) de los ficheros disponibles dentro de él. Si lo consigo, entonces ya tengo la mitad del trabajo hecho. Solo quedaría hacer el rename().

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le "opendir(DIR,'.');for(readdir DIR){print}"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si el opendir() no funciona, usaría el comando diamante: <*.afa>, por ejemplo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le "for(<*>){print}"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otro detalle importante... readdir() te va a devolver, no solo los ficheros, sino también los directorios, incluido '.' (el propio directorio), y el '..' (el directorio padre). Es muy posible que esto sea la causa del problema.

Para esto último, agrega esta línea, a tu programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         next if -d $archivos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
con lo que el bucle saltará sobre los directorios, y solo se fijará en los ficheros normales.
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: Función rename() regresa error "Permission denied"

Notapor szenteno » 2010-04-27 16:16 @719

Bueno, pues cuando hago el rename() después del chdir() en el directorio donde tengo mis archivos, sí le cambió el nombre. Aún así escribí:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chdir("C:\\Documents and Settings\\Dalia\\Escritorio\\szenteno\\Laboratorio\\Bisulfitos\\Copia de CyMATE");

opendir(DIR,'.');
for(readdir DIR){
        print;
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


al inicio de mi script, quitándole el opendir() y eso que tenía antes y me imprime los archivos, y luego agregué:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@file = readdir (DIR);
@file=sort(@file);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


debajo de eso, y ya el foreach que cambia los nombres, y no sale el error, pero tampoco cambia los nombres.
Y cuando abajo de eso agrego:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
opendir(DIR,'.');
@file= readdir (DIR);
@file=sort(@file);
foreach $nada(@file){
        print "$nada\n";
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


se imprimen dos veces los archivos (obvio), y después aparece el error de los permisos.

¿Significa que sí es culpa de los permisos?
szenteno
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-04-27 11:09 @506

Re: Función rename() regresa error "Permission denied"

Notapor explorer » 2010-04-27 18:55 @830

¿Pero has puesto la excepción de los directorios?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;
  5.  
  6. use Getopt::Long;
  7.  
  8. my %opts;
  9.  
  10. GetOptions (
  11.     \%opts,
  12.     'd=s',
  13.     'o=s',
  14.     'help|h',
  15. );
  16.  
  17. my $directorio = $opts{d};
  18.  
  19. chdir $directorio  or  die "ERROR: No puedo entrar en el $directorio: $!\n";
  20.  
  21. opendir(DIR, '.')  or  die "ERROR: No puedo leer el directorio: $!\n";
  22.  
  23. for my $archivo (sort readdir DIR) {
  24.     next if ! -f $archivo;            # saltamos al siguiente, si no es un fichero normal
  25.  
  26.     #my $persona   = uc substr $archivo,  0, 2;
  27.     #my $gen       = uc substr $archivo,  3, 4;
  28.     #my $extension =    substr $archivo, -4;
  29.     my($persona, $gen, $extension) = unpack "A2 x A4 A4", $archivo;
  30.     uc $persona;
  31.     uc $gen;
  32.  
  33.     my $nombre    = "$gen $persona$extension";
  34.  
  35.     say  "[$archivo]=>[$nombre]";
  36.     rename($archivo,   $nombre)  or  die "ERROR: No puedo renombrar [$archivo] a [$nombre]: $!\n";
  37. }
  38.  
  39. closedir DIR;
  40.  
  41. __END__
  42.  
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

Siguiente

Volver a Básico

¿Quién está conectado?

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