Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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\n",$dirCount,$path;
}
else {
printf "***** : %s\n",$path;
}
}

my $endTime=times();
printf "\n\ntake %.4f seconds of CPU.\n\n",$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

4 réponses

Avatar
Jacques Caron
Salut,

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

- 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.

Avatar
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

--
dominix

Avatar
kurtz le pirate
In article <42d17515$0$19998$,
DoMinix wrote:

::> 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+
Avatar
damien guerin
A ce prix là tu peux directement faire :
`rm -rf $path` et éviter ainsi ton test (à priori inutile)...