Página 1 de 1

Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-11-29 22:47 @991
por pablgonz
Hola a todos, estoy terminando de escribir un script y me he topado con el siguiente problema: en uno de los directorios donde necesito ejecutar una llamada al sistema, tengo un archivo extra y deseo eliminarlo: sé que siempre es el último y los archivos están numerados 1, 2, 3..., n, algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. fig-1.pdf,fig-2.pdf,fig-3.pdf,fig-4.pdf,fig-5.pdf 

¿Cómo recorro el directorio para eliminar solo el último de los archivos?

De antemano, muchas gracias.
Pablo

Re: Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-11-30 10:28 @478
por explorer
Puedes probar a hacer un contador, y así sabes cuál es el último.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $i = 1;
  2.  
  3. while (-e "fig-${i}.pdf") {     # mientras exista un archivo con ese índice
  4.     $i++;                       # pasamos al siguiente
  5. }                               # hasta que encontremos uno que no
  6.  
  7. $i--;                           # vamos al anterior que sabemos que existe
  8.  
  9. unlink "fig-${i}.pdf";          # y lo borramos
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-12-02 22:37 @984
por pablgonz
Muchísimas gracias, lo había logrado, pero tu solución es más corta.

Re: Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-12-04 05:20 @263
por Aceitunas
Una pregunta... no entiendo cómo se usa ${i}, yo habría hecho esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $i = 1;
  2.      
  3.     while (-e "fig-". i . ".pdf") {     # mientras exista un archivo con ese índice
  4.         $i++;                       # pasamos al siguiente
  5.     }                               # hasta que encontremos uno que no
  6.      
  7.     $i--;                           # vamos al anterior que sabemos que existe
  8.      
  9.     unlink "fig-${i}.pdf";          # y lo borramos
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Me puede alguien explicar qué significan las llaves detrás del '$'? Quiero entender que el $ toma el carácter que va en la variable de dentro de las llaves pero no sé si es así...

Re: Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-12-04 08:08 @380
por explorer
Tu solución no funcionará porque le falta '$' delante de la 'i'.

Aparte de eso, el uso de las llaves en forma de '${i}' es porque lo que rodea a la variable $i puede afectar a su nombre con lo que Perl podría confundirse.

Un ejemplo más claro. Si pongo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $precio = 15;
  2. my $var = "Coste: $precio_euros";
  3. say $var;     # quiero que salga en pantalla "Coste 15_euros"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Si ejecuto estas líneas, sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Coste:
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que no es lo que esperaba. Si le pongo "use strict;" al principio del programa, sale este error:
Global symbol "$precio_euros" requires explicit package name at ./kk.pl line 21.
Execution of ./kk.pl aborted due to compilation errors.

y ya vemos lo que pasa: que Perl se ha creído que la variable que hemos escrito es '$precio_euros'. Y no es eso lo que queremos.

Es obvio que esto sí funcionará:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $var = "Coste: $precio euros";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
porque '$precio' está separado de lo que le sigue por un espacio en blanco. Pero, ¿qué ocurre si lo que queremos es que nuestra variable salga como antes, unida a algo que le sigue?
La forma tradicional es la que has comentado antes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $var = "Coste: " . $precio . "_euros";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y funciona... pero... es largo, y son dos operaciones de concatenación, cuando solo queremos una simple interpolación de una variable.
También se podría hacer con sprintf, desde luego:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $var = sprintf "Coste: %s_euros", $precio;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero... sigue quedando largo :)
Entonces, necesitamos separar la variable '$precio' de lo que le sigue. Y ahí es donde aparecen las llaves:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $var = "Coste: ${precio}_euros";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más información en tu propio ordenador en perldoc perldata, y en la Web (traducido al español), en la sección Constructores de valores escalares, al final.

P.D.: en el ejercicio, lo que sigue a '$i' es un punto, que no afectaría al nombre de la variable, así que, realmente, las llaves sobran. Pero decidí ponerlas porque así me aseguraba por si en el futuro las condiciones cambiaban. Ejemplo: $archivo = "${dia}_${mes}_${year}_001.pdf";

Re: Recorrer un directorio y eliminar un archivo

NotaPublicado: 2013-12-04 10:39 @486
por Aceitunas
¡Muchas gracias!