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 11: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 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 11: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: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda Paoletta » ven giu 06, 2008 12: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: 3907
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » ven giu 06, 2008 12: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 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 13: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: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » ven giu 06, 2008 13: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: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » ven giu 06, 2008 16: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 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » lun giu 09, 2008 23: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 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggioda conraid » lun giu 09, 2008 23: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: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Perl]Scansione ricorsiva di directory

Messaggioda mordecai » mar giu 10, 2008 0: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 21:59


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti