9
votes

Comment trouver des fichiers / dossiers récursivement dans le script Perl?

J'ai un script Perl que j'ai écrit pour rechercher des fichiers présents dans mes dossiers Windows, récursivement. Je saisis le texte de recherche comme argument d'exécution du script Perl pour trouver un fichier ayant ce texte dans son nom. Le script Perl est comme ci-dessous: xxx

mais cela ne recherche pas tous les sous-répertoires récursives. Je sais glob ne correspond pas récursivement.
Tellement essayé d'utiliser le module Fichier :: Rechercher et la fonction Trouver (\ & Wanted, @directories);

Mais j'ai eu une erreur disant trouver () non défini. De ce que j'ai lu de l'aide, je pensais que la fonction trouver () est définie par défaut dans l'installation PERL, avec un code de base pour rechercher des dossiers / fichiers. N'est-ce pas correct?

question est, dans le script Perl ci-dessus, comment recherchez-moi des fichiers / dossiers récursivement?

Deuxième questions, j'ai trouvé que perdoc < Module> Aide n'a pas d'exemples sur l'utilisation d'une certaine fonction dans ce module, ce qui le ferait clairement.

Pouvez-vous indiquer une bonne aide / document / livre pour utiliser diverses fonctions Perl à partir de différents modules Perl avec des exemples clairs d'utilisation de ces fonctions de module.


1 commentaires

Ma méthode de cette question Stackoverflow.com/Questtions/4979310/... pourrait aider. Dans ce cas, la tâche était de renommer tous les fichiers et dossiers d'un répertoire et de tous les sous-répertoires. La méthode pourrait facilement être modifiée pour vos utilisations.


5 Réponses :


5
votes

Ces deux pages sont tout ce dont vous avez besoin pour étudier:


1 commentaires

Link Seules les réponses sont découragées sur les sites Stackexchange. Un exemple de code court, comme dans d'autres réponses, aurait été très accueilli.



4
votes

Une alternative serait d'utiliser FINT2PERL pour créer le début du script pour vous. Il peut activer une commande de recherche comme, xxx

à un script Perl équivalent. Vous venez de mettre Find2perl au lieu de trouver. Il utilise le fichier :: Trouvez sous le capot mais vous va aller rapidement.


2 commentaires

Merci. Lear Not This Findt2perl et n'a pas trouvé de démarreur très utile d'obtenir des scripts de recherche de fichiers par défaut que je joue avec.


En effet, je pense que la réponse de Alessandro est vraiment meilleure mais pour vous aider à trouver 2perl est vraiment utile.



4
votes

Si cela ne vous dérange pas d'utiliser le module CPAN, chemin :: Classe peut faire le travail pour vous: xxx


1 commentaires

BTW, bonne nouvelle, dans mes tests, cela semble également travailler sur une nouvelle copie de OSX Lion (10.8.5) jusqu'à mon dernier test que j'ai fait sur OSX El Capitan (10.11) sans avoir à installer le module. Donc, si vous étiez comme moi, construire un installateur qui s'appuyait sur ce fonctionnement par défaut - il fait.



18
votes

Un autre excellent module à utiliser est Fichier :: Trouver :: Rule qui cache une partie de la complexité de fichier :: trouve tout en exposant la même fonctionnalité riche.

use File::Find::Rule;
use Cwd;

my $cwd = getcwd();
my $filelist;

sub buildFileIndex {
    open ($filelist, ">", "filelist.txt") || die $!;

    # File find rule
    my $excludeDirs = File::Find::Rule->directory
                              ->name('demo', 'test', 'sample', '3rdParty') # Provide specific list of directories to *not* scan
                              ->prune          # don't go into it
                              ->discard;       # don't report it

    my $includeFiles = File::Find::Rule->file
                             ->name('*.txt', '*.csv'); # search by file extensions

    my @files = File::Find::Rule->or( $excludeDirs, $includeFiles )
                                ->in($cwd);

    print $filelist map { "$_\n" } @files;
    return \$filelist;
}


1 commentaires

Je pense qu'il peut y avoir deux petites erreurs avec ce code (pour tout «noob» l'essayer) d'abord, il n'y a pas de lien avec le sous-programme lui-même, alors rien ne serait utilisé. (besoin de "& BuildfileIndex;" sous getcwd ();) En outre, le fichier TXT "ouvert" n'est pas "fermé", le fichier ne serait donc pas lisible par un autre code. Juste une pensée



0
votes
use 5.022;
use strict;
use warnings;

use POSIX qw(uname);
use File::Find;

my $kernel_ver = (uname())[2];
my @dir = (
  "/lib/modules/$kernel_ver/kernel/drivers"
);

find(\&wanted, @dir);

sub wanted {
  say if /.*\.ko\.xz/;
}

0 commentaires