OVH Cloud OVH Cloud

Lister des fichiers le plus rapidement possible

6 réponses
Avatar
Aurelien
Bonjour

Je cherche le moyen le plus rapide pour lister des fichiers en Perl 5.005_3.

Cette version ne possédant apparement pas une fonction glob
fonctionnelle, je cherche le moyen le plus rapide pour faire ce que fait
glob().

Je me suis actuellement rabattu sur un opendir+readdir+m//, ca marche
pas mal, mais je me demande si on peut pas faire mieux ?

Merci d'avance

Aurélien

6 réponses

Avatar
saorge
On Sun, 08 Aug 2004 14:34:19 +0200, Aurelien wrote:

Je me suis actuellement rabattu sur un opendir+readdir+m//, ca marche
pas mal, mais je me demande si on peut pas faire mieux ?


use File::Find

Avatar
Paul Gaborit
À (at) Fri, 20 Aug 2004 00:11:44 +0200,
saorge écrivait (wrote):
On Sun, 08 Aug 2004 14:34:19 +0200, Aurelien wrote:

Je me suis actuellement rabattu sur un opendir+readdir+m//, ca marche
pas mal, mais je me demande si on peut pas faire mieux ?


use File::Find


Sans voir le script à base de 'opendir', 'readdir' et 'm//', il est difficile
d'affirmer que File::Find fera mieux !

;-)

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>


Avatar
Aurelien
Paul Gaborit wrote:
À (at) Fri, 20 Aug 2004 00:11:44 +0200,
saorge écrivait (wrote):

On Sun, 08 Aug 2004 14:34:19 +0200, Aurelien wrote:


Je me suis actuellement rabattu sur un opendir+readdir+m//, ca marche
pas mal, mais je me demande si on peut pas faire mieux ?


use File::Find



Sans voir le script à base de 'opendir', 'readdir' et 'm//', il est
difficile

d'affirmer que File::Find fera mieux !

;-)


En fait, la recherche est faite qu'un sein d'un seul répertoire, donc je
ne sais pas si File::Find marchera mieux en effet .

Voici le script :

__BEGIN__

# Convertit le pattern Shell en expression régulière
$filetemplate =~ s#*#.*#g;

my @files = ();

# Teste chaque fichier du répertoire
if (opendir(IMGDIR, $PHOTODIR)) {
@files = grep /$filetemplate/, readdir(IMGDIR);
closedir(IMGDIR);
}

__END__


Aurélien



Avatar
Paul Gaborit
À (at) Sat, 21 Aug 2004 15:43:34 +0200,
Aurelien écrivait (wrote):
En fait, la recherche est faite qu'un sein d'un seul répertoire, donc je ne
sais pas si File::Find marchera mieux en effet .


Dans ce cas, non. Au contraire ;-)

Voici le script :

__BEGIN__

# Convertit le pattern Shell en expression régulière
$filetemplate =~ s#*#.*#g;


Si c'est pour votre propre utilisation, cela peut suffire. Mais si le pattern
shell provient de l'extérieur, c'est loin d'être suffisant. Il faudrait mieux
passer par un appel préalable à 'quotemeta'. Et même pour votre usage
personnelle, pensez tout de même à 'quoter' les points (.) qui précèdent les
extensions.

my @files = ();

# Teste chaque fichier du répertoire
if (opendir(IMGDIR, $PHOTODIR)) {
@files = grep /$filetemplate/, readdir(IMGDIR);
closedir(IMGDIR);
}


else {
die "Can't read '$PHOTODIR' : $!n";
}

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Aurelien
Paul Gaborit wrote:
Dans ce cas, non. Au contraire ;-)

C'est bien ce que je pensais.

Donc, rien de plus rapide ?

Si c'est pour votre propre utilisation, cela peut suffire. Mais si le
pattern

shell provient de l'extérieur, c'est loin d'être suffisant. Il
faudrait mieux

passer par un appel préalable à 'quotemeta'. Et même pour votre usage
personnelle, pensez tout de même à 'quoter' les points (.) qui
précèdent les

extensions.


Oui, tout à fait.
Le pattern est généré par le script un peu avant, donc, rien à craindre,
je maitrise la génération de ceci.
(Il eu fallu également changer les '?')


Aruélien

Avatar
Paul Gaborit
À (at) Mon, 23 Aug 2004 12:47:36 +0200,
Aurelien écrivait (wrote):
Paul Gaborit wrote:
Dans ce cas, non. Au contraire ;-)

C'est bien ce que je pensais.

Donc, rien de plus rapide ?


Le seul moyen de gagner un tout petit peu de temps si le répertoire contient
beaucoup de fichiers serait de les traiter les uns après les autres plutôt que
de construire une liste préalable des fichiers à traiter. On y gagne le temps
d'allocation de la liste ou des deux listes dans le cas du filtrage. Mais ne
comptez pas là-dessus pour gagner beaucoup ;-)

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>