Ou comment appliquer un traitement à chaque fichier de façon
récursive en partant d'un répertoire. En fait, le module
File::Find agit exactement de la même façon que le
programme find lui même.
On définit un certain nombre d'options, au minimum le répertoire de départ, on donne une fonction sub qui sera appliquée à chaque fichier.
Dans l'exemple ci-dessous, on utilise ce module pour parser un répertoire, comparer la clef SHA-1 de chaque fichier avec la précédente et pour scanner les nouveaux fichiers avec un anti-virus :
use File::Find;
use Cache::FileCache;
my $scan = "/usr/local/bin/clamscan --remove";
my $dir = "/home/user/filer/";
my $sha1 = "/usr/local/bin/openssl sha";
my $cache = new Cache::FileCache();
my $old;
sub get_info {
my $file = $_;
if(-d $file) {
next;
}
my $cached_key_file = $cache -> get($file);
my $key_file = `$sha1 '$file'`;
if(not defined($cached_key_file)
or $cached_key_file ne $key_file) {
my $scan = `$scan '$file'`;
warn $scan ."\n";
$cache -> set($file,$key_file,'1 M');
}
else {
warn $file ." already scanned\n";
}
}
find(\&get_info,$dir);