• Publicidad

Renombrar ficheros recursivamente

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

Renombrar ficheros recursivamente

Notapor xagutxu_perez » 2008-09-09 11:49 @534

¡Hola, perleros!

Tengo varios directorios llamados BLOCK00 -> BLOCK23 y en cada uno de ellos tengo 10 directorios SESxxx, de la siguiente forma:

BLOCK00 -> SES000, SES001, SES002... SES009
BLOCK01 -> SES010, SES011, SES012... SES019
...
BLOCK23 -> SES230, SES231, SES232... SES 239


Dentro de cada SES hay 316 ficheros de audio, cuyo nombre comienza por una U+Nºses+Nºfichero (p.ej. en SES011 hay: U011001.wav, U011002.wav, U011003.wav... U011316.wav). El problema es que un tercio de los ficheros de audio no comienzan por "U", sino por "u". Y he ahí el problema. Me gustaría renombrar todos los ficheros que empiecen con "u" en "U--", pero no consigo hacer más que chapucillas.

¿A alguien se le enciende la bombilla?

Xagutxu
xagutxu_perez
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2008-04-04 03:56 @206

Publicidad

Notapor Kiloko » 2008-09-09 13:22 @598

¿No sería más fácil primero agrupar todos los archivos, para no tener tantos directorios y subdirectorios? ¿Cuál es el fin de renombrar los archivos?

Yo lo primero que haría sería juntar todo en una carpeta con 2 archivos, y ya después de ahí partir.
:D
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2008-09-09 13:59 @624

Para hacer búsquedas recursivas, hay varios módulos. Aquí hay una solución a tu problema:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use File::Find;

sub encuentra {
    return if $File::Find::name !~ m[^\./BLOCK];

    my $nuevo_nombre = uc $File::Find::name;

    if ($nuevo_nombre ne $File::Find::name) {
        rename $File::Find::name, $nuevo_nombre;
    }
}

find({ wanted => \&encuentra, no_chdir => 1}, '.');

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Usando el módulo File::Find, hacemos una búsqueda recursiva por todos los directorios y ficheros, quedándonos solo con aquellos ficheros que empiezan por './BLOCK' (no es muy ortodoxo, pero bueno...).

Luego, creamos el nuevo nombre nuevo, que será pasar todo a mayúsculas (sigue sin ser ortodoxo...)

Si el $nuevo_nombre es distinto del que tenemos, lo renombramos.
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

Notapor explorer » 2008-09-09 14:15 @635

Esta es otra solución, que mantiene la extensión wav en minúsculas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use File::Find;

sub encuentra {
    if ((my $nuevo_nombre = $File::Find::name) =~ s/u(\d+\.wav)/U$1/) {
        rename $File::Find::name, $nuevo_nombre;
    }
}

find({wanted => \&encuentra, no_chdir => 1}, '.');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por cada fichero del directorio actual '.' y todos sus subdirectorios, vemos si coincide con el patrón /u(\d+\.wav)/, y si es así, lo cambiamos por la 'U' mayúscula.
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

Notapor explorer » 2008-09-09 15:41 @695

Esta es otra versión. El módulo File::Find, a veces es un poco pesado de usar. Hay otros módulos que ayudan a hacer las cosas más simples.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use File::Find::Rule;

for my $fichero ( File::Find::Rule->file()->name('u*.wav')->in(glob('BLOCK*')) ) {
    my $nuevo_fichero = $fichero;
    $nuevo_fichero =~ s[/u][/U];
    rename $fichero, $nuevo_fichero;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El módulo File::Find::Rule nos busca por ficheros (file()), que coincida con el patrón de los ficheros wav, en los directorios que nos interesan.

Luego, hacemos la conversión de la 'u' inicial y renombramos.
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: No hay usuarios registrados visitando el Foro y 1 invitado