[Perl] Leer contenido de un directorio y escribirlo en pequeños archivos

Salvador Ortiz Garcia sog en msg.com.mx
Mie Abr 30 12:41:07 CDT 2008


On Wed, 2008-04-30 at 01:19 -0500, Carmen Marcela Alegria C. wrote:
> Hola Lista,
> 
>  Tengo un directorio con un poco mas de 25 mil
> archivos y es un poco complicado manejarlos. Por eso
> quiero que los nombres de los archivos sean guardados
> en archivos con X cantidad de lineas para procesar
> dichas rutas despues.
> 

Hola Marcela,

Una primera optimización consiste en no tener que estar abriendo
el archivo de salida para cada linea, usando el operador 'módulo':

$c=0;
$i=0;

opendir(DIR, $ARGV[0]) or die "can't open dir $ARGV[0]: $!\n";
while (defined($file = readdir(DIR))) {
  if($i % 15 == 0) {
    $c++;
    open FH, ">./arch-$c" or die "Can't open file ./arch-$c: $!\n";
  }
  print FH "$file\n";
  $i++;
}
closedir DIR;
print "$i lines saved in $c files\n";


Que funciona pues '$i % N == 0' es 'true' para 0 y todos los múltiplos
de N, y cada vez que abres un nuevo archivo el anterior se cierra
automáticamente.

Notas:

  'if($i % 15 == 0) {' lo puedes escribir como 'unless($i % 15) {'

   Si no pones paréntesis en el 'open' necesitas usar 'or' y no '||'.

   Agregué "\n" en los "die" para hace menos verboso el mensaje.

   A lo mejor te convendría guardar el "path" completo de cada archivo,
   cambiando 'print FH "$file\n"' por 'print FH "$ARGV[0]/$file\n"'

Saludos.

Salvador Ortiz.





Más información sobre la lista de distribución Perl