Non ci sono sei modi per fare questo, c'è il vecchio modo, e il nuovo modo. Il vecchio modo è con File :: Trova, e ne hai già un paio di esempi. File :: Find ha un'interfaccia di callback piuttosto orribile, è stato bello vent'anni fa, ma da allora siamo passati.
Ecco un programma di vita reale (leggermente modificato) che utilizzo per eliminare il cruft su uno dei miei server di produzione. Usa File :: Trova :: Regola, piuttosto che File :: Trova. File :: Trova :: regola ha una bella interfaccia dichiarativa che legge facilmente.
Randal Schwartz ha anche scritto File :: Finder, come wrapper su File :: Trova. È abbastanza bello ma non è davvero decollato.
#! /usr/bin/perl -w
# delete temp files on agr1
use strict;
use File::Find::Rule;
use File::Path 'rmtree';
for my $file (
File::Find::Rule->new
->mtime('<' . days_ago(2))
->name(qr/^CGItemp\d+$/)
->file()
->in('/tmp'),
File::Find::Rule->new
->mtime('<' . days_ago(20))
->name(qr/^listener-\d{4}-\d{2}-\d{2}-\d{4}.log$/)
->file()
->maxdepth(1)
->in('/usr/oracle/ora81/network/log'),
File::Find::Rule->new
->mtime('<' . days_ago(10))
->name(qr/^batch[_-]\d{8}-\d{4}\.run\.txt$/)
->file()
->maxdepth(1)
->in('/var/log/req'),
File::Find::Rule->new
->mtime('<' . days_ago(20))
->or(
File::Find::Rule->name(qr/^remove-\d{8}-\d{6}\.txt$/),
File::Find::Rule->name(qr/^insert-tp-\d{8}-\d{4}\.log$/),
)
->file()
->maxdepth(1)
->in('/home/agdata/import/logs'),
File::Find::Rule->new
->mtime('<' . days_ago(90))
->or(
File::Find::Rule->name(qr/^\d{8}-\d{6}\.txt$/),
File::Find::Rule->name(qr/^\d{8}-\d{4}\.report\.txt$/),
)
->file()
->maxdepth(1)
->in('/home/agdata/redo/log'),
) {
if (unlink $file) {
print "ok $file\n";
}
else {
print "fail $file: $!\n";
}
}
{
my $now;
sub days_ago {
# days as number of seconds
$now ||= time;
return $now - (86400 * shift);
}
}
Penso che potresti avere un problema con la semplicità, spesso in Perl la semplicità non è la soluzione migliore o più elegante. –
Buon punto, grazie. Lascerò a tutti la possibilità di farlo nelle loro risposte se ritengono che ciò contribuisca alla loro soluzione. – keparo