O que você quer é o módulo File::Find
. A função find()
do módulo atravessa a árvore de diretórios e executa uma sub-rotina específica definida dentro dessa função (embora isso possa ser definido externamente).
Abaixo está um exemplo de uso. Aqui encontramos todos os arquivos e os colocamos em array, para que você possa depois iterar sobre cada item da matriz e fazer algo com ele; é necessário, pois find()
não gosta quando você tenta alterar um arquivo durante a travessia da árvore de diretórios. Adapte o script conforme necessário
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
my @wanted_files;
# The wanted subroutine is enclosed into find(sub,dir) command
# but can be used outside as well
find(
sub{
-f $_ && $_ =~ /^\d{4}-\d{2}-\d{2}.*csv.gz/
&& push @wanted_files,$File::Find::name
}, "."
);
foreach(@wanted_files){
print "$_\n"
}
Execução de teste:
$ tree
.
├── 2017-03-01_AmdocsWebHourlyReport.csv.gz
├── 2017-03-01_ComverseHourlyReport.csv.gz
├── 2017-03-02_AmdocsWebHourlyReport.csv.gz
├── 2017-03-02_ComverseHourlyReport.csv.gz
├── find_files.pl
└── some_random_file.blah
0 directories, 6 files
$ ./find_files.pl
./2017-03-02_ComverseHourlyReport.csv.gz
./2017-03-01_ComverseHourlyReport.csv.gz
./2017-03-02_AmdocsWebHourlyReport.csv.gz
./2017-03-01_AmdocsWebHourlyReport.csv.gz