Repository 32bit  Forum
Repository 64bit  Wiki

[Perl]Scansione ricorsiva di directory

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[Perl]Scansione ricorsiva di directory

Messaggioda mordecai » ven giu 06, 2008 12:31

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.... #-o
mordecai
Linux 2.6
Linux 2.6
 
Messaggi: 752
Iscritto il: mer gen 10, 2007 22:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 12:43

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12214
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda Paoletta » ven giu 06, 2008 13:01

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
Codice: Seleziona tutto
grep  "STRINGA"
e
Codice: Seleziona tutto
grep -ir "STRINGA" PERCORSODIR
?
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3927
Iscritto il: lun apr 25, 2005 0:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » ven giu 06, 2008 13:17

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?
mordecai
Linux 2.6
Linux 2.6
 
Messaggi: 752
Iscritto il: mer gen 10, 2007 22:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 14:33

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 :-(
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12214
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 14:37

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 !$?;
}


Avatar utente
conraid
Staff
Staff
 
Messaggi: 12214
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » ven giu 06, 2008 17:15

Ho risolto felicemente personalizzando la subroutine wanted!È stato molto più facile del previsto.

Grazie! [-o<
mordecai
Linux 2.6
Linux 2.6
 
Messaggi: 752
Iscritto il: mer gen 10, 2007 22:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » mar giu 10, 2008 0:22

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
mordecai
Linux 2.6
Linux 2.6
 
Messaggi: 752
Iscritto il: mer gen 10, 2007 22:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » mar giu 10, 2008 0:39

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12214
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » mar giu 10, 2008 1:33

È proprio vero "wanted" è un nome imposto.
E mo? :-k
mordecai
Linux 2.6
Linux 2.6
 
Messaggi: 752
Iscritto il: mer gen 10, 2007 22:59


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti