Pagina 1 di 1
[Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 12:31
da mordecai
Ciao a tutti!
Sto facendo uno script in perl che all'interno di un file mi trova determinate stringhe.
Ora vorrei fare una evoluzione di questo script,che praticamente non scansiona solo un file,ma partendo da una directory scansiona tutti i file in essa contenuti e tutte le sottodirectory con i relativi file.Insomma una scansione ricorsiva.
Avete suggerimenti?Sto veramente impazzendo per sto fatto....

Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 12:43
da conraid
Se voglio cercare in /home
Codice: Seleziona tutto
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/home');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
print("$name\n");
}
Come dice il buon larry wall perché fare cose già fatte?
man find2perl
Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 13:01
da Paoletta
mordecai ha scritto:Ciao a tutti!
Sto facendo uno script in perl che all'interno di un file mi trova determinate stringhe.
Ora vorrei fare una evoluzione di questo script,che praticamente non scansiona solo un file,ma partendo da una directory scansiona tutti i file in essa contenuti e tutte le sottodirectory con i relativi file.Insomma una scansione ricorsiva.
perchè farlo in perl quando bastano
e
?
Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 13:17
da mordecai
Si in effetti potevo usare quel modulo.Ma ora ho un altro problema.
L'obiettivo ora è di trovare all'interno di tutti quei file una determinata stringa,e magari solo dei file .txt.
Non è un problema perchè ho già fatto lo script relativo a questo:
Codice: Seleziona tutto
#!/usr/bin/perl
$file = open(IN,"file.txt");
$var = 0;
while ($line = <IN>) {
$var++;
if ($line = "ciccio") {
print "Parola trovata alla riga $var\n $line\n";
}
}
close(IN);
Ora non so come far interagire questo script con l'altro.
Si può fare?
Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 14:33
da conraid
Prova a "giocare" dentro la subroutine wanted
find2perl usa File::Find (
http://search.cpan.org/~rgarcia/perl-5. ... le/Find.pm)
guarda se può esserti di aiuto. Non uso perl da più di dieci anni ormai

Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 14:37
da conraid
Per esempio questo fa un grep "pippo" nei file trovati
Codice: Seleziona tutto
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
sub doexec ($@);
use Cwd ();
my $cwd = Cwd::cwd();
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/tmp');
exit;
sub wanted {
/^.*\.txt\z/s &&
doexec(0, 'grep','pippo','{}');
}
sub doexec ($@) {
my $ok = shift;
my @command = @_; # copy so we don't try to s/// aliases to constants
for my $word (@command)
{ $word =~ s#{}#$name#g }
if ($ok) {
my $old = select(STDOUT);
$| = 1;
print "@command";
select($old);
return 0 unless <STDIN> =~ /^y/;
}
chdir $cwd; #sigh
system @command;
chdir $File::Find::dir;
return !$?;
}
Re: [Perl]Scansione ricorsiva di directory
Inviato: ven 6 giu 2008, 17:15
da mordecai
Ho risolto felicemente personalizzando la subroutine wanted!È stato molto più facile del previsto.
Grazie! [-o<
Re: [Perl]Scansione ricorsiva di directory
Inviato: mar 10 giu 2008, 0:22
da mordecai
Col modulo find è possibile usare solo una sub?
E se volessi usare più di una subroutine col modulo find,non è possibile?
Piccolo esempio:
Codice: Seleziona tutto
use strict;
use File::Find ();
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
#Scansione ricorsiva attraverso l'albero di directory
File::Find::find({wanted => \&wanted}, '/home/');
sub wanted2;
File::Find::find({wanted2 => \&wanted2}, '/home/');
exit;
Come mai questo codice mi da errore?Non ho fatto forse lo stesso procedimento con la seconda sub?
NB:le sub non le ho incluse nel codice
grazie
Re: [Perl]Scansione ricorsiva di directory
Inviato: mar 10 giu 2008, 0:39
da conraid
Non riesco a capire bene la documentazione cosa intende per la sub wanted
Prova a guardare qui
http://www.perlmonks.org/index.pl?node_id=217378
Guardando il file find.pm vedo che ci sono dei riferimenti precisi a $wanted, non vorrei che sia un nome imposto.
Ma come ti ho detto sono troppo arrugginito su perl e non solo per aiutarti
Re: [Perl]Scansione ricorsiva di directory
Inviato: mar 10 giu 2008, 1:33
da mordecai
È proprio vero "wanted" è un nome imposto.
E mo?
