Un simple outil pour faciliter l'administration des fichiers seg-d.

ls_segd

Accueil

Journal de mission
Course à pied
Ski de randonnée
Alpinisme
Voile
Ecrits
Diaporamas

Programmation

Carnet des invités

Accueil > Programmation > ls_segd.

Un simple outil pour faciliter l'administration des fichiers seg-d.

But

Donner un meilleur aperçu des fichiers seg-d présents sur un système.

Méthode

Il est difficile d'avoir un aperçu efficace des fichiers seg-d présents sur un système, ceux-ci se trouvant souvent en très grand nombre. A titre d'exemple, notre système comporte ici;

lxuser@nasstor01:/mnt/data1/SEGD> find /mnt/data1/SEGD -name "*.segd" | wc -l 
71424

...quelque 71,424 fichiers. Si la commande suivante listera l'ensemble de ces fichiers de façon ordonnée;

lxuser@nasstor01:/mnt/data1/SEGD> find /mnt/data1/SEGD -name "*.segd" | sort

...son résultat, étalé sur plusieurs centaines de pages, est pour ainsi dire illisible.

Je rajoute une simple petite commande clé, que j'appelle "ls_segd.pl";

lxuser@nasstor01:/mnt/data1/SEGD> find /mnt/data1/SEGD -name "*.segd" | sort | ls_segd.pl

...qui compacte ces milliers de lignes en une petite trentaine, de ce fait maintenant exploitables;

lxuser@nasstor01:/mnt/data1/SEGD> find /mnt/data1/SEGD -name "*.segd" | sort | ls_segd.pl
Path                                                          From file, to file, number of files;
/mnt/data1/SEGD/FlipFlop_orig/tape2460-SW5224-JD261             30912 ..    30917        6
/mnt/data1/SEGD/FlipFlop_orig/tape8002                              1 ..      373      373
/mnt/data1/SEGD/tape2434                                            1 ..       18       18
/mnt/data1/SEGD/tape2434                                           66 ..       82       17
/mnt/data1/SEGD/tape2434                                           85 ..      102       18
/mnt/data1/SEGD/tape2434                                          150 ..      167       18
/mnt/data1/SEGD/tape2434                                          169 ..      186       18
/mnt/data1/SEGD/tape2434                                          236 ..      253       18
/mnt/data1/SEGD/tape2434                                          256 ..      261        6
/mnt/data1/SEGD/tape2434                                          263 ..      272       10
/mnt/data1/SEGD/tape2434                                          400 ..     1529     1130
/mnt/data1/SEGD/tape2434                                         1720 ..     1737       18
/mnt/data1/SEGD/tape2434                                         1787 ..    16900    15114
/mnt/data1/SEGD/tape2438                                        16901 ..    22995     6095
/mnt/data1/SEGD/tape2444                                            1 ..      357      357
/mnt/data1/SEGD/tape2444                                          374 ..      992      619
/mnt/data1/SEGD/tape2448                                            1 ..      771      771
/mnt/data1/SEGD/tape2451                                            1 ..      635      635
/mnt/data1/SEGD/tape2453                                            1 ..     4078     4078
/mnt/data1/SEGD/tape2455                                            1 ..     3623     3623
/mnt/data1/SEGD/tape2456                                            1 ..     3159     3159
/mnt/data1/SEGD/tape2458                                            1 ..     1513     1513
/mnt/data1/SEGD/tape2458                                         4000 ..    16124    12125
/mnt/data1/SEGD/tape2459                                        16125 ..    31037    14913
/mnt/data1/SEGD/tape2558                                            1 ..     2549     2549
/mnt/data1/SEGD/tape7010                                       200000 ..   204222     4223
Total                                                           71424 files

En résumé, on l'aura sans doute compris, le répertoire /mnt/data1/SEGD/tape2444, par exemple, comprend les fichiers 00000001.segd à 00000357.segd et 00000374.segd à 00000992.segd. Les fichiers de numéro 358 à 373 inclusivement sont absents. Voici la commande ls_segd.pl;

lxuser@nasstor01:/mnt/data1/SEGD> cat /usr/local/bin/ls_segd.pl
#!/usr/bin/perl -w
# G. Martineau, Indes 2008, revision Arabie 2009. (ver 1.0)
use strict;
my ( $dir, $num, $prev_dir, $prev_num, $tot, $n );
my ( $segd_ext, $fmt1, $fmt2 ) = ( "\.segd", "%-60s", "%8d" );
printf "$fmt1  From file, to file, number of files;\n", "Path";
while (<>) {
    if ( ( $dir, $num ) = ( $_ =~ m!^(.*)/(\d+)$segd_ext$! ) ) {
        $tot++;
        !defined( $prev_dir) && printf "$fmt1 $fmt2", $dir, $num;
        if ( defined( $prev_num ) && ( ( $num - $prev_num != 1 ) || !( $dir eq $prev_dir ) ) ) {
            printf " .. $fmt2 $fmt2\n$fmt1 $fmt2", $prev_num, $n, $dir, $num;
            $n = 0;
        }
        ( $prev_num, $prev_dir ) = ( $num, $dir );
        $n++;
    }
}
printf " .. $fmt2 $fmt2\n$fmt1 $fmt2 files\n", $num, $n, "Total", $tot;

Il ne suffit que de coller ces 19 lignes dans un fichier /usr/local/bin/ls_segd.pl que l'on rendra exécutable (chmod 775) et que l'on placera typiquement sur les machines de types nas0x ou nasstor0x.

Principe

Pour ceux s'intéressant à la mécanique, après impression d'une ligne d'en-tête, le script prend tout ce qui lui arrive en entrée par cette boucle while ;

while (<>) {

A condition que l'entrée satifasse un nom de fichier segd, ce qui, il est vrai, sera nécessairement le cas si l'utilisateur a au préalable activé le filtre de recherche "-name "*.segd", il dissèque de celle-ci le répertoire et le nom (numéro) de fichier;

if ( ( $dir, $num ) = ( $_ =~ m!^(.*)/(\d+)$segd_ext$! ) ) {

Par évaluation paresseuse du "et" logique, un tout premier répertoire et premier fichier segd sont affichés pour une même suite. Dès le premier passage effectué, "!defined( $prev_dir )" sera toujours faux, rendant inutile l'évaluation et donc l'exécution du second membre.

!defined( $prev_dir ) && printf "$fmt1 $fmt2", $dir, $num;

Un changement de répertoire ou une discontinuité dans la suite de fichiers sont détectés ainsi;

if ( defined( $prev_num ) && ( ( $num - $prev_num != 1 ) || !( $dir eq $prev_dir ) ) ) {

Auquel cas, les bornes de cette discontinuité sont affichées ainsi;

printf " .. $fmt2 $fmt2\n$fmt1 $fmt2", $prev_num, $n, $dir, $num;

Pour situer, signalons que ceci permet par exemple l'affichage des caractères (ici en gras) signalant la discontinuité (fin de ligne et début de ligne suivante);

/mnt/data1/SEGD/tape2444                                            1 ..      357      357
/mnt/data1/SEGD/tape2444                                          374 ..      992      619

Nous devons réactualiser le répertoire et numéro de fichier courants;

( $prev_num, $prev_dir ) = ( $num, $dir );

Incrémenter le nombre de fichiers pour une même suite;

$n++;

Enfin, pour terminer, après épuisement des données, nous imprimons finalement le pied de page;

printf " .. $fmt2 $fmt2\n$fmt1 $fmt2 files\n", $num, $n, "Total", $tot;

Racourcis

Certains peuvent trouver laborieux de devoir taper cette commande au clavier. En effet, on pourra insérer cette simple ligne;

alias ls_segd='find /mnt/data1/SEGD -name "*.segd"|sort|ls-segd.pl'
dans le fichier $HOME/.bashrc pour n'avoir plus qu'à taper "ls_segd"

D'autres encore peuvent associer cette propre commande dans une macro pour un aperçu tel sous webmin;

 

Haut de page

Tous droits réservés © 2003-2006 Gaétan Martineau