[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.
Rispondi
mordecai
Linux 3.x
Linux 3.x
Messaggi: 752
Iscritto il: mer 10 gen 2007, 21:59

[Perl]Scansione ricorsiva di directory

Messaggio 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.... #-o

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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

Codice: Seleziona tutto

grep  "STRINGA"
e

Codice: Seleziona tutto

grep -ir "STRINGA" PERCORSODIR
?

mordecai
Linux 3.x
Linux 3.x
Messaggi: 752
Iscritto il: mer 10 gen 2007, 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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?

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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 :-(

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Perl]Scansione ricorsiva di directory

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



mordecai
Linux 3.x
Linux 3.x
Messaggi: 752
Iscritto il: mer 10 gen 2007, 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggio da mordecai »

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

Grazie! [-o<

mordecai
Linux 3.x
Linux 3.x
Messaggi: 752
Iscritto il: mer 10 gen 2007, 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Perl]Scansione ricorsiva di directory

Messaggio 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

mordecai
Linux 3.x
Linux 3.x
Messaggi: 752
Iscritto il: mer 10 gen 2007, 21:59

Re: [Perl]Scansione ricorsiva di directory

Messaggio da mordecai »

È proprio vero "wanted" è un nome imposto.
E mo? :-k

Rispondi