|
|
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. ButDonner un meilleur aperçu des fichiers seg-d présents sur un système. MéthodeIl 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. PrincipePour 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; RacourcisCertains 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;
|
|
|
Tous droits réservés © 2003-2006 Gaétan Martineau |