martes, 2 de abril de 2013

Perl: Leer directorios del sistema


A veces es necesario leer un listado de nombres de archivos desde un directorio específico.
A continuación un ejemplo que recibe como parámetro desde la línea de comandos una ruta de directorio y muestra en pantalla un listado de los archivos y directorios que se encuentran dentro.

Tiene una característica especial, dado que mostrará solamente los archivos con extensión .txt. Este ejemplo puede ser fácilmente adaptado o otras tareas.


-------------------------------------------- CORTAR AQUI ------------------------------------------------------- 
#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
#######################################################
# Recupera los nombres de archivos y directorios dentro de una ruta
# especifica escrita desde la linea de comandos
#######################################################
my $directorio="/home/";
my $archivo;

if ($#ARGV==-1) {
    #sin parametros
    exit
} else {
    $directorio=$ARGV[0];
    opendir DH,$directorio or die "no se puede abrir el directorio: $!";
    foreach $archivo (readdir DH){
        #busca archivos .txt
#comentar el if si se desea tener un listado completo del directorio
#        if ($archivo=~ /\.txt/){
            print "$archivo \n";
#        }
    }#foreach
    closedir DH;
} 
-------------------------------------------- CORTAR AQUI ------------------------------------------------------- 

5 comentarios:

  1. Buenísimo, me sirvió un montón, ahora me surge una duda. Supongamos que uso expresiones regulares para abrir un archivo especifico.
    Tengo los archivos *.txt de la siguiente manera.

    ID1-fecha-.txt
    ID2-fecha-.txt
    ID3-fecha-.txt

    Me ingresan por STDIN el numero para abrir el archivo, pero no encuentro manera de hacerlo. Probé lo siguiente:

    @lista = readdir(DIR);
    foreach $file (@lista) {
    if ($file=~/ID$palabra._/){ #o /ID.$pa
    print "$file \n";
    }
    close(DIR);

    Pero no me funciona.

    Saludos

    ResponderEliminar
    Respuestas
    1. Por las dudas, escribí mal el formato de los nombres, serían algo así:

      ID1_fecha-.txt
      ID2_fecha-.txt
      ID3_fecha-.txt
      Por eso el /ID.$palabra._/

      $palabra serían lo que me ingresan por STDIN.

      Eliminar
    2. Hola amigo, ante todo gracias por el feedback del artículo, realmente estoy volviendo a activar el blog. Al momento, te podría decir que coloques el nombre del archivo por la entrada estándar, pero tengo que probar. Saludos.

      Eliminar