Vérifier la présence d'un fichier à partir d'un masque

Vérifier la présence d'un fichier à partir d'un masque - Perl - Programmation

Marsh Posté le 25-10-2007 à 11:01:39    

Bonjour,
 
J'ai fait un script dont le but est de vérifier la présence d'un certain nombre de fichiers à partir de masques.
Par exemple je veux savoir si il existe dans un répertoire donné un fichier qui commence par ABC.
 
Hélas, en faisant un if -f ABC*, ca ne fonctionne pas et il m'indique que le fichier n'est pas présent, malgré qu'il existe bien un fichier ABC123 par exemple.
 
J'en conclue que le if -f nécessite de connaître le nom précis du fichier.
Savez vous s'il existe une solution de contournement pour vérifier à partir d'un masque contenant un * ?
 
Merci par avance.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 25-10-2007 à 11:01:39   

Reply

Marsh Posté le 25-10-2007 à 11:22:48    

Code :
  1. foreach (sort readdir(DIRHANDLE)) {
  2.     print "found file: $_\n" if /^ABC/;
  3.   }

Reply

Marsh Posté le 25-10-2007 à 11:36:29    

Si je comprend bien, ca va me lister les fichiers contenus dans le répertoire et qui répondent au masque.
 
Le soucis, c'est que je veux uniquement contrôler la présence (savoir s'il y en a au moins un) et ce sans avoir à l'ouvrir.
Le but étant de vérifier l'arrivée d'un certain nombre de fichiers répondant chacun à un masque (les masques sont dans un fichier pamamètre et ca ca fonctionne déjà bien) et de remonter une alerte en cas d'absence d'un ou plusieurs fichiers.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 25-10-2007 à 11:44:57    

cybervince a écrit :

Le soucis, c'est que je veux uniquement contrôler la présence (savoir s'il y en a au moins un) et ce sans avoir à l'ouvrir.


RTFM :o
la tu parcours le repertoire mais en aucun cas tu ouvres/lis le fichier ...

Reply

Marsh Posté le 25-10-2007 à 14:03:36    

anapajari a écrit :


RTFM :o
la tu parcours le repertoire mais en aucun cas tu ouvres/lis le fichier ...


Oui je suis d'accord avec toi.
Ce que je voulais en fait, c'est éviter d'avoir à faire un parcours de tout le répertoire alors qu'il existe peut-être une fonction "native" qui permet de tester l'existance du fichier.
 
Je vais déjà essayer de cette façon pour voir si ca fonctionne.
Merci de ton aide ;)


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 25-10-2007 à 14:10:29    

tu peux également faire un grep sur ta list, si la boucle te gène... ça dépend vraiment de ce que tu as besoin de faire [:spamafote]
 
Et puis  si tu veux pas le faire "à la main" t'as plein de modules qui te permettent de faire ça dont File::Find par exemple ( mais grosso modo ça revient au même).

Reply

Marsh Posté le 30-10-2007 à 02:20:36    

Il faut utiliser la fonction glob, qui rend tous les fichiers matchant le pattern (à la sauce unix).
 
Cordialement,

Reply

Marsh Posté le 30-10-2007 à 09:03:51    

<*.foo>

Reply

Marsh Posté le 30-10-2007 à 11:46:38    

Bon finalement j'avais adopté la méthode de balayer le répertoire :
Pas forcément ce qu'il y a de plus rapide niveau système, mais ca fonctionne bien.
 

Code :
  1. # On compte le nombre de fichiers dans le répertoire qui corrspondent au masque
  2.                 my $nbfic = 0;
  3.                 opendir (my $dir, $REP_CFT_IN) or die "$REP_CFT_IN n'existe pas !";
  4.                 my @files = readdir $dir;
  5.                 foreach $fichier (@files)
  6.                 {
  7.                         $nbfic++ if ($fichier =~ /^$idf/);
  8.                 }
  9.                 # S'il y a au moins un fichier, c'est OK
  10.                 if ($nbfic > 0)
  11.                 {
  12.                         print " => OK\n";
  13.                         print LOG " => OK\n";
  14.                 } else
  15.                 {
  16.                         print " => KO\n";
  17.                         print LOG " => KO\n";
  18.                         $STATUT_GLOBAL = 1;
  19.                         push(@erreurs, $idf);
  20.                 }


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 30-10-2007 à 11:53:33    

un petit truc pour que ça aille plus vite, au lieu de:

Code :
  1. foreach $fichier (@files)
  2.                {
  3.                        $nbfic++ if ($fichier =~ /^$idf/);
  4.                }


je ferais plutot:

Code :
  1. foreach $fichier (@files)
  2.                {
  3.                        $nbfic++ && last if ($fichier =~ /^$idf/);
  4.                }


Il manque par ailleurs un closedir dans ton bordel.

cybervince a écrit :

Pas forcément ce qu'il y a de plus rapide niveau système, mais ca fonctionne bien.


[:prozac] plz explain ...

Reply

Marsh Posté le 30-10-2007 à 11:53:33   

Reply

Marsh Posté le 30-10-2007 à 11:56:15    

pourquoi vous voulez pas glober ? Y a bien MTOWTDI mais quand même

Reply

Marsh Posté le 30-10-2007 à 12:06:53    

Moi j'ai rien contre mais comme je le disais plus haut ça dépend vraiment de ce qu'il veut faire.
Et de ce que je comprends de son truc, File::Find me parait quand même plus adapté que File::Glob [:dawa]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed