Accueil ⇒ Informatique ⇒ Langage Perl ⇒ Exécution groupée

Exécution groupée

Présentation

Introduction du 2 avril 2005

Ce qui suit est en fait la reprise d'un fichier README accompagnant le script redistribué. On y précise l'utilisation du programme, ainsi que quelques choix conceptuels. Viennent ensuite le script à proprement parler, un petit commentaire, et une conclusion.

Le script sortwp.pl répond à un besoin fréquent des utilisateurs qui souhaitent trier leurs données par le vide : quels fichiers garder et quels fichiers supprimer dans tel ou tel dossier ? Il n'existe pas toujours d'outil parfaitement approprié à la tâche, d'où l'idée de ce petit script en Perl.

Son but est de réaliser une opération précise pour chaque fichier d'un dossier donné, l'opération étant précisée par l'utilisateur. Une fois l'instruction terminée, le programme demande simplement si le fichier doit ou non être supprimé : la réponse par défaut est non.

$ /bin/sortwp.pl
 
Author: Naopic Tastalian
Website: http://www.tastalian.org/
Programming time: less than 42 minutes.
Comment: l'abus de lit est un travers sain.
 
--
This code is redistributed without any WARANTY,
use it at your own risks !
--
 
Enter test instruction :        vlc
Enter folder :                  /videos

Le chemin du dossier peut être donné en relatif par rapport au dossier courant.

Utilisation

L'utilisation du logiciel est assez simple : au lancement, le script demande une instruction de test à l'utilisateur ainsi que le dossier comportant les fichiers à trier. Si le dossier comporte lui-même d'autres dossiers, ceux-ci seront ignorés.

Conception

Il serait aisé de reprendre ce script et d'en généraliser l'utilisation, en remplaçant par exemple l'appel à la commande de suppression par une autre, choisie par l'utilisateur. Mais l'idée initiale du programme est de servir de tutorial à quelques néophytes en Perl : les améliorations significatives sont donc laissées au lecteur(trice) à titre d'exercice.

Le script

#!/usr/pkg/bin/perl -w
 
use strict;
 
# ============================================================
# Miscéllanée globale.
 
# Paramètres.
my $VERBOSE = 0;
 
# Variables.
my ($cmd, $file, $folder, $rm);
my @files;
 
# Propagande.
CREDITS: print "\nAuthor: Naopic Tastalian\n";
print "Website: http://www.tastalian.org/\n";
print "Programming time: less than 42 minutes.\n";
print "Comment: l'abus de lit est un travers sain.\n";
print "\n--\n";
print "This code is redistributed without any WARANTY,\n";
print "use it at your own risks !\n";
print "--\n\n";
 
# ============================================================
# Lecture de l'entrée.
 
print "Enter test instruction :\t";
$cmd = <STDIN>;
chomp($cmd);
 
print "Enter folder :\t\t\t";
$folder = <STDIN>;
chomp($folder);
 
if (!(-e $folder)) {
    print "Folder $folder doesn't exist.";
} elsif (!(-d $folder)) {
    print "$folder is not a folder.";
} else {
    chdir($folder);
}
 
# ============================================================
# Traitement.
 
@files = `ls`;
 
NEXT_FILE: while ($#files >= 0) {
    # Nom du fichier :
    my $file = $files[$#files];
    chomp($file);
    pop(@files);
 
    # Ne lire que les fichiers :
    if (-d $file) {
        print "$file is a folder.\n" if ($VERBOSE);
        goto NEXT_FILE;
    }
 
    system("$cmd ./$file");
 
    # Confirmation de suppression :
    print "Do you want to delete $file [y/N] ? ";
    $rm = <STDIN>;
    chomp($rm);
 
    # Passage a l'acte :
    if ($rm eq "y" || $rm eq "yes" ||
        $rm eq "Y" || $rm eq "YES") {
        print "Deleting $file...\n" if ($VERBOSE);
        system(`rm -f $file`);
    } elsif ($VERBOSE) {
        print "Keeping $file...\n";
    }
}

Les quatre premières parties ne devraient pas poser de problème une fois les bases du Perl maîtrisées. Dans la cinquième section, vous noterez l'emploi d'opérateurs hérités du shell pour tester l'existence et le type d'un dossier ; pour le changement de répertoire, on utilise la fonction propre à Perl plutôt qu'une commande système. Enfin, la dernière partie ne pose pas de problème particulier : on acquiert la liste des fichiers dans un tableau via la commande système, puis on les énumère tous.

Améliorations possibles

On peut améliorer ce petite script sur quelques points, même si, par nature, la complexité globale ne pourra pas passer sous la base du \small {\cal O}(n). En voici une liste non-exhaustive, laissée au lecteur à titre d'exercice :

Conclusion

Ce petit script, conçu il y a fort longtemps dans la lignée de quelques autres, n'est pas un mauvais support pour pratiquer le Perl, et il n'est pas dénué d'utilité pratique. Je le concède, une bonne maîtrise du shell évite l'écriture de tout ce code, mais un shell n'est pas aussi portable qu'un script Perl...