• Publicidad

Descomprimir ficheros rar

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

Descomprimir ficheros rar

Notapor skanskan » 2010-05-18 09:04 @419

Buenas

¿Cómo sería el código en Perl que haga lo siguiente?

Lo ejecutas en un directorio en el que hay varios archivos comprimidos .rar.

El script ejecuta unrar (o similar) que extrae cada archivo en un directorio con su mismo nombre y si dentro de ese directorio hay un archivo readme.txt lo renombra con el mismo nombre de antes.

Por ejemplo, si lo hiciésemos a mano:

unrar x nombre1.rar
cd nombre1
ren readme.txt nombre1.txt
(pero sólo si existe)
y sigue descomprimiendo...

Y que el unrar lo busque en el path y en el mismo directorio.
skanskan
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-05-10 08:13 @384

Publicidad

Re: Descomprimir ficheros rar

Notapor explorer » 2010-05-18 12:03 @543

Suposiciones:
* estamos en el mismo directorio donde están los ficheros rar a extraer
* la ruta al ejecutable unrar está en la variable $PATH, por lo que Perl podrá ejecutarlo directamente

Proceso (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Listado de los ficheros rar disponibles:
my @ficheros = <*.rar>;

# Por cada uno...
foreach my $fichero (@ficheros) {

    # descomprimimos
    system("unrar x $fichero");  # suponemos que al descomprimir,
                                 # unrar crea un subdirectorio con el nombre del fichero

    # Parte del nombre del fichero rar
    my($nombre) = $fichero =~ /^(.+)\.rar$/i;

    # Comprobamos si existe el fichero readme
    if (-e "$nombre/readme.txt") {
        # Si es así, le renombramos
        rename "$nombre/readme.txt", "$nombre/$nombre.txt";
    }
}
Coloreado en 0.002 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

Re: Descomprimir ficheros rar

Notapor skanskan » 2010-05-18 16:00 @708

Gracias.

Lo probaré.

Es que hace tiempo que quería aprender Perl para no hacer las cosas cútremente con el batch de DOS, y porque es más potente. Me he empezado a leer un manual pero tenía prisa por ir a ejemplos concretos.

¿Qué diferencia hay entre ejecutar el comando con system(...) y ejecutarlo con `...`?
¿Y qué diferencia hay entre usar rename() y usar system("ren...")?

Saludos
skanskan
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-05-10 08:13 @384

Re: Descomprimir ficheros rar

Notapor explorer » 2010-05-18 16:46 @740

Ejecutar un comando con las comillas invertidas es lo mismo que hacerlo con el operador qx(), que después de hacer una interpretación de la cadena que se le pasa como argumento, lo ejecuta en el sistema bajo la shell predeterminada, y la salida del comando es devuelta a Perl.

En cambio, system() ejecuta el comando y solo regresa el valor de estado, el resultado de la operación.

Las diferencias entre usar rename() y el del sistema, son:

* Al usar system("ren ..."), estamos lanzando un nuevo proceso en el sistema (el entorno de línea de órdenes), que a su vez lanzará el ejecutable ren (no siempre, porque en algunos sistemas viene integrado en el entorno de línea de órdenes). El problema que puede ocurrir también es que quieras un día ejecutar este programa en otra máquina, y en ella no tenga instalado ningún comando llamado ren, por lo que tendrás que editar el programa y poner ahí el nombre del comando adecuado (en Linux, sería mv).

* En cambio, con rename(), Perl no tiene que crear un nuevo proceso, sino que llamaría a la función del sistema que se encarga de cambiar de nombre un fichero en el sistema de ficheros. Y además, es una ventaja porque te independiza de cómo se llame el comando de renombrado del sistema (la desventaja comentada antes con el system("ren ...")).
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: Descomprimir ficheros rar

Notapor skanskan » 2010-05-18 17:00 @750

Gracias.

Muy aclaratorio.
skanskan
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-05-10 08:13 @384

Re: Descomprimir ficheros rar

Notapor skanskan » 2010-05-19 05:38 @276

Lo único que no me ha quedado claro es la línea

my($nombre) = $fichero =~ /^(.+)\.rar$/i;

A mi entender se evalúa primero la parte de la derecha, por lo de la precedencia de los operadores. Es decir, se comprueba si $fichero contiene la cadena de texto del rar.

Y lo que me parece extraño es... ¿la variable $nombre almacenará un valor booleano en vez del nombre del fichero?

Saludos
skanskan
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-05-10 08:13 @384

Re: Descomprimir ficheros rar

Notapor explorer » 2010-05-19 06:38 @318

Lo que estás viendo es una asignación, así que primero se evalúa la expresión regular sobre la variable $fichero, y el resultado se deja en $nombre. Hasta ahí, lo has entendido.

Ahora bien... una expresión regular se puede ejecutar en contexto escalar o en contexto lista.

Si lo ejecutamos en contexto escalar, lo que devuelve es, efectivamente, un valor booleano indicando si se encontró el patrón o no. Y en contexto lista, nos devolverá la lista de valores que han sido capturados por los paréntesis de captura, dentro de la expresión regular. En nuestro caso, sí que hay esos paréntesis: (.+), que capturan el nombre del fichero, sin la extensión rar.

En Perl, siempre hay que prestar atención al contexto en que estamos ejecutando las sentencias.

Examen: ¿cuál es la salida del siguiente programa?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $nombre1;
  4. my $nombre2;
  5.  
  6. my $fichero = "fichero.rar";
  7.  
  8.  $nombre1  = $fichero =~ /^(.+)\.rar$/i;
  9. ($nombre2) = $fichero =~ /^(.+)\.rar$/i;
  10.  
  11. print "[$nombre1][$nombre2]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Antes de ejecutarlo, intenta resolverlo mentalmente.

Fíjate que las líneas son las mismas, pero la segunda tiene un par de paréntesis en el lado de la asignación. Son justamente, esos paréntesis, los que indican que estamos ejecutando la sentencia en contexto lista.

En Perl, algunas cosas son muy poco importantes, como el espacio en blanco, pero en otras, hay que prestar atención a los detalles.

Más información en perlop, en la sección Regexp Quote-Like Operators, subsección Matching in list context.
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: Descomprimir ficheros rar

Notapor skanskan » 2010-05-19 07:46 @365

Lo he ejecutado para ver si el primer corchete daba 1 o true y ya está claro.

[1][fichero]


saludos
skanskan
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-05-10 08:13 @384

Re: Descomprimir ficheros rar

Notapor explorer » 2010-07-28 22:04 @961

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

Gracias por tu aporte, zlatan24, aunque el hilo trata de cómo leer, descomprimir y manejar los nombres de los ficheros rar, desde Perl.
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 7 invitados

cron