Newsgroup: it.comp.lang.perl
Titolo: visita ricorsiva di directory

Salve a tutti,
il mio problema, forse banale, è quello di realizzare uno script perl che mi
elenchi tutti i file "*.gif" (ad esmpio) che si trovano nel sottoalbero con
radice la directory corrente.
L'output che vorrei avere deve contenere il path del file ed il suo nome, ad
esempio:
....
/home/marco/foto.gif
/home/marco/progetto/immagini.gif
...
Per fare il matching nella directory corrente uso questo script:
#!/usr/bin/perl
{ foreach $file (glob "*.gif")  {
    print $ENV{$HOME} ;
    print "$file \n";
}
exit;
Come potrei modificarlo perchè cerchi i file "*.gif" in tutto il
sottoalbero?
Grazie,
Marco

}
Non ti serve modificarlo, cancellalo proprio e sostituiscilo con il mio
codice.
Devo avvisarti che implementandoti da solo la funzione iterativa ottieni
(almeno dai miei test che feci risulto' questo) codice abbastanza piu'
veloce, ma questo non ti dovrebbe preoccupare a meno che non possiedi
migliaia di files sul tuo sito. (va anche detto che la versione iterativa
completamente self-made che ti puoi fare occupa un ben piu' di 3 righe!!!)
Se ti interessava il risultato credo che la mia risposta di dovrebbe
accontentare :-)
Se ti interessava invece imparare a crearti tu una funzione del
genere(iter/ricor), beh fatti sentire e ti do qualche spunto...
Alex
P.S. se guardi nella guida, e spulci i moduli standard, scopri che c'e' un
mucchio di roba interessante.... (tra quelli non standard pure, ma diventa
un problema installarli se il server non e' tuo !!!)

}
Manca ovviamente una graffa:
sub wanted
                print "$File::Find::name\n" if(/\.gif\b/i);
}
Scusa ma e' tardi !!!
Alex

Sto scemo di Outlook (rimpiango di aver acceso in modalita' windows) non mi
mostra una graffa, non so, magari voi la vedere ad ogni modo provo a
scrivere in modo diverso:
sub wanted { print "$File::Find::name\n" if(/\.gif\b/i); }    # Funzione
wanted
Alex
P.S. Questa non mi era mai capitata !!!


Tempo fa scrissi uno script che faceva l'upload di una dir (con relative
subdir) su un server FTP.
Ti riporto parti di codice che ho usato, poichè ho implementato il tutto
senza moduli aggiuntivi (a parte Net::FTP :-) e senza la shell; potresti
usarlo come spunto per implementare ciò che serve a te (o giustamente usare
File::Find)!
Ciao, Ezio Bonsi
PS: Ricordo che il codice sotto e' da riguardare e migliorare, scritto per
esigenze pratiche e non in un programma (quindi scritto velocemente).
PS2: Usando questo pezzetto hai oltretutto del codice portabile (lo ho fatto
girare su Win e su Linux).
$numfile = 0;
opendir (DIR, $dirclient) || die "\nImpossibile aprire la directory
$dirclient\n$!";
@dir = readdir DIR;
closedir DIR;
foreach (@dir)
{
   uploadfile ($dir[$_]);
}
print "\r Processo terminato, $numfile files caricati.\n";
sub uploadfile ($)
{
   my $nomefile = $_[0];
   return if ($nomefile =~ /\.$/ or $nomefile =~ /\.$/);
   if (-f "$dirclient\\$nomefile" ne '')
   {
      # il file da caricare e' veramente un file
      $numfile++;
      print "\rTrasferimento del file numero $numfile: $nomefile";
      # ... ricavo l'estensione del file
      $nomefile =~ /.*\.(.*)/;
      # eseguo l'ipload in ascii o binary
      # [cut] ve lo rispoarmio :-)
   }
   elsif (-d "$dirclient\\$nomefile" ne '')
   {
      # il file da caricare e' una directory
      opendir (D, "$dirclient\\$nomefile") || print "\nErrore: Impossibile
aprire la directory $nomefile\n";
      my @d = readdir D;
      my $k = 0;
      closedir D;
      $dirclient = "$dirclient\\$nomefile";
      print "\rCreazione directory $nomefile";
      $ftp -> mkdir($nomefile);
      $curdir = $ftp -> pwd();
      $ftp -> cwd("$curdir/$nomefile");
      foreach $k (0..$#d)
      {
         uploadfile ($d[$k]);
      }
      $ftp -> cdup();
      $dirclient =~ /(.*)\\$nomefile/;
      $dirclient = $1;
   }
   else
   {
      print "\nErrore: $dirclient\\$nomefile e' di un tipo sconosciuto.\n";
   }
}

questa cosa o vuoi solo ottenere il risultato !!!
Una via di mezzo :)

voglio fare.
invece di if(/\.gif\b/i); metti if(/\.gif$/i);
Alex
P.S. spero di non averti disturbato,  ma ti ho risposto anche in privato,
visto che ho pensato bene di inviarti parecchio materiale per risponderti
alle altre questioni .