[debutant] j'obtiens des choses bizarres...

Le
kurtz le pirate
bonjour,

voila le petit script que je suis en train de faire :

begin --
#!/usr/bin/perl -w
use strict;

my $beginTime = times();

my $target = "Thumbnails";

my $command = "find / -name ".$target;
my @result = `$command`;
chomp(@result);


my $dirCount=0;
my $path;

foreach $path (@result) {
if ($path =~ /^//) {
$dirCount++;
printf "%5d : %s",$dirCount,$path;
}
else {
printf "***** : %s",$path;
}
}

my $endTime=times();
printf "take %.4f seconds of CPU.",$endTime-$beginTime;
end

rien de transcendant. j'obtiens ceci :
1 : /Library/Application
Support/iDVD/Tutorial/Tutorial.dvdproj/Contents/Resources/Thumbnails
2 : /Users/admin/darwinports/dports/audio/lame/CVS/Thumbnails
3 : /Users/admin/darwinports/dports/audio/libao/CVS/Thumbnails

3198 : /Users/admin/WIP/myFolder/minimac/RuneCD/Thumbnails
3199 : /Users/admin/WIP/myFolder/minimac/Thumbnails


take 0.0100 seconds of CPU.

find: /.Trashes: Permission denied
find: /private/etc/cups/certs: Permission denied


et mes questions :

- deja, 0.01 secondes c'est pas vrai. le script tourne pendant plus
d'une minute.
- le test $path =~ /^// (pour moi : commence par / ) ne marche pas.
- pourquoi des lignes sont encore écrites après la fin du script


c'est pénible un débutant :))
merci de votre aide
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jacques Caron
Le #45159
Salut,

On Sun, 10 Jul 2005 17:37:11 +0200, kurtz le pirate

- deja, 0.01 secondes c'est pas vrai. le script tourne pendant plus
d'une minute.


Tu mesures uniquement le temps CPU pris par le processus et ses enfants,
alors que l'essentiel du temps est passé soit dans le noyau soit à
attendre que les disques répondent. Si tu veux le temps "réel" regarde du
côté de "time" ou "gettimeofday" (dans Time::HiRes pour ce dernier).

- le test $path =~ /^// (pour moi : commence par / ) ne marche pas.


Ben visiblement si, ça marche très bien, sinon tu n'aurais pas la liste...

- pourquoi des lignes sont encore écrites après la fin du script


Ce sont des messages renvoyés par find sur STDERR (donc non pris en charge
par perl). Logiquement ils auraient du s'afficher avant, mais la synchro
de STDOUT et STDERR peut quelquefois jouer des tours en fonction des
bufferisations différentes.

Jacques.

DoMinix
Le #44723
bonjour,

voila le petit script que je suis en train de faire :

--- begin -----------------------------------------------------------


my $command = "find / -name ".$target;
my @result = `$command`;
chomp(@result);


en plus des conseils de Jacques ...
1/ utilise directement
my @result =`find / -type f -name $target 2>/dev/null`
comme ça tu n'aura pas a tester si ce n'est pas un repertoire.

2/ utilise File::Find qui le fait directement en perl
2bis/ utilise find2perl pour convertir ta recherche find

--
dominix

kurtz le pirate
Le #44722
In article DoMinix
::> bonjour,
::>
::> voila le petit script que je suis en train de faire :
::>
::> --- begin -----------------------------------------------------------
::
::>
::> my $command = "find / -name ".$target;
::> my @result = `$command`;
::> chomp(@result);
::
::en plus des conseils de Jacques ...
::1/ utilise directement
::my @result =`find / -type f -name $target 2>/dev/null`
::comme ça tu n'aura pas a tester si ce n'est pas un repertoire.
::
::2/ utilise File::Find qui le fait directement en perl
::2bis/ utilise find2perl pour convertir ta recherche find

super tes explications DoMinix! surtout le 2>/dev/null. je n'y avais
pas pensé car les lignes :
find: /.Trashes: Permission denied
find: /private/etc/cups/certs: Permission denied
qui remontaient, ben c'était des messages d'erreurs.

tout baigne maintenant... enfin presque car avec cette liste de dossier,
je peux les effacer sauf ceux qui ne sont pas vides que je compte
traiter avec un truc du style :

if (rmdir($path)) {
print "n$path supprime";
}
else {
print "n$path not emptyn";
chdir($path);
my $rm = `rm -r -f $path/*.*`;
rmdir($path);
}

encore merci
a+
damien guerin
Le #44721
A ce prix là tu peux directement faire :
`rm -rf $path` et éviter ainsi ton test (à priori inutile)...
Publicité
Poster une réponse
Anonyme