how files perl unix count directory solaris

perl - files - forma más rápida de contar la cantidad de archivos en un directorio que contiene cientos de miles de archivos



ssh count files (2)

Lo que hace ahora lee el directorio completo (más o menos) en la memoria solo para descartar ese contenido para su recuento. Evite eso al transmitir el directorio en su lugar:

my $count; opendir(my $dh, $curDir) or die "opendir($curdir): $!"; while (my $de = readdir($dh)) { next if $de =~ /^/./ or $de =~ /config_file/; $count++; } closedir($dh);

Es importante destacar que no use glob() en ninguna de sus formas . glob() stat() costosa stat() cada entrada , que no es la sobrecarga que desea.

Ahora, puede tener formas mucho más sofisticadas y livianas de hacer esto dependiendo de las capacidades del sistema operativo o de las capacidades del sistema de archivos (Linux, a modo de comparación, ofrece inotify), pero la transmisión del directorio como se describe anteriormente es casi tan buena como la que obtendrá .

En un sistema Solaris que procesa grandes cantidades de archivos y almacena su información en una base de datos (sí, sé que usar la base de datos es la forma más rápida de obtener información sobre la cantidad de archivos que tenemos). Necesito una forma rápida de supervisar los archivos a medida que avanzan por el sistema en su camino a ser almacenados en una base de datos.

Actualmente uso un script de Perl que lee en el directorio de una matriz y luego toma el tamaño de la matriz y lo envía a una secuencia de comandos de supervisión. Lamentablemente, a medida que nuestro sistema crece, este monitor se vuelve cada vez más lento.

Estoy buscando un método que operará mucho más rápido en lugar de pausar y actualizar cada 15-20 segundos después de realizar la operación de conteo en todos los directorios involucrados.

Estoy relativamente seguro de que mi cuello de botella es el directorio de lectura en la operación de matriz.

No necesito información sobre los archivos, no necesito tamaños ni nombres de archivos, solo el número de archivos en el directorio.

En mi código, no cuento los archivos ocultos o los archivos de texto que uso para mantener la información de configuración. Sería genial si esta funcionalidad se conservara, pero ciertamente no es obligatoria.

He encontrado algunas referencias para contar inodos con código C o algo parecido, pero no tengo mucha experiencia en esa área.

Me gustaría hacer que este monitor sea lo más real posible.

El código de Perl que uso se ve así:

opendir (DIR, $currentDir) or die "Cannot open directory: $!"; @files = grep ! m/^/./ && ! /config_file/, readdir DIR; # skip hidden files and config files closedir(DIR); $count = @files;


Que sea breve.

@files = readdir(DIR) - 2; The -2 is because readdir counts "." and ".." as directory entries. print @files . " files found/n"; exit;

1 archivos encontrados