perl - varios - ¿Cómo puedo leer los archivos en un directorio en orden ordenado?
mover varios archivos en linux (3)
Puedes probarlo con un poco de magia Glob, glob parece funcionar de una manera ordenada, así que esto:
# Glob in scalar context iterates the result set internally
while( defined( my $dir = glob($dir . ''/*'' ) ) ){
print $dir, "/n";
# $dir is fed ordered and with full names.
}
o
# Glob in list context returns all results.
for( glob($dir.''/*'' ) ){
print $dir , "/n";
# also ordered.
}
Deberia trabajar. Solo ten cuidado con glob, porque esto:
for(0..20){
printf "%30s|%30s/n", glob($dir.''/*'' ), glob($dir.''/*'' );
}
hace algo semi-mágico e imprime el contenido del directorio dos veces en cada línea. es decir:
/foo/bar/a | /foo/bar/a
/foo/bar/b | /foo/bar/b
/foo/bar/c | /foo/bar/c
/foo/bar/d | /foo/bar/d
Cuando leo un directorio en Perl con opendir
, readdir
y closedir
, la función readdir
no parece leer los archivos en un orden específico (que puedo decir).
Estoy leyendo un directorio que tiene subdirectorios nombrados por timestamp de época:
1224161460
1228324260
1229698140
Quiero leer en estos directorios en orden numérico, lo que pondría primero los directorios más antiguos.
Cuando uso readdir
, el primero que dice es 1228324260, que es el del medio. Sé que podría poner los contenidos del directorio en una matriz y ordenar la matriz, pero ¿hay alguna opción que pueda pasar a readdir
para leer en orden ordenado? ¿O tal vez una forma más elegante de lograr esto que empujar todo en conjunto y ordenar la matriz? Probablemente existan módulos para hacer esto también, pero es difícil instalar módulos en nuestro entorno, así que a menos que sea un módulo integrado, preferiría no usar módulos ...
¡Gracias!
EDITAR Según lo solicitado, publico el código que estoy usando:
opendir( my $data_dh, $data_dir ) or die "Cannot open $data_dir/n";
while ( my $name = readdir($data_dh) ) {
next if ( $name eq ''.'' or $name eq ''..'' );
my $full_path = "${data_dir}/${name}";
next unless ( -d $full_path );
process_dir($full_path);
}
closedir($data_dh);
Solo inserte una sort
delante de cualquier operador de lista que desee reordenar. No es necesario almacenar los resultados en una matriz tampoco. Puedes usar un foreach
:
opendir my($dh), $dirname or die "Could not open directory [$dirname]: $!";
foreach my $file ( sort { $a <=> $b } readdir $dh )
{
...
}
readdir se puede llamar en contexto de matriz, así que haz esto:
opendir( my $data_dh, $data_dir) or die "Cannot open $data_dir/n";
my @files = sort { $a <=> $b } readdir($data_dh);
while ( my $name = shift @files ) {
...