Re: Bash script question
On Thu, Dec 07, 2006 at 12:16:54PM -0600, Nate Bargmann wrote:
>
> I have a directory of files that are created daily using
> filename-`date +%Y%m%d`.tar.gz so I have a directory with files whose
> names advance from filename-20061201.tar.gz to filename-20061202.tar.gz
> to filename-20061203.tar.gz and so on. Based on the date in the
> filename, I would like to delete any than are X days older than today's
> date. So, I'm not interested in the actual created/modified date, just
> the numeric string in the name.
... what, no Perl one-liner yet?? :)
So, here it is, the line noise version that should do the job:
$ perl -MTime::Local -e 'unlink grep {/-(\d{4})(\d\d)(\d\d)/; timelocal(0,0,0,$3,$2-1,$1)<time-864000} glob "*.tar.gz"'
This would delete all of your .tar.gz files older than 10 days (or
864000 secs), in the current directory.
Cheers,
Almut
PS: Of course, you can add some whitespace and stuff, and make a script
out of this, e.g.
#!/usr/bin/perl
use Time::Local;
my $t_crit = time - 10*24*60*60;
unlink
grep {
/-(\d{4})(\d\d)(\d\d)/;
timelocal(0,0,0,$3,$2-1,$1) < $t_crit;
}
glob "*.tar.gz";
Or, even more verbose, almost self-documenting:
#!/usr/bin/perl -w
use Time::Local;
my $t_crit = time - 10*24*60*60;
my $wildcard = "*.tar.gz";
my $date_pattern = qr/-(\d{4})(\d\d)(\d\d)/;
my @files = glob $wildcard;
for my $file (@files) {
my ($year, $mon, $day) = $file =~ $date_pattern;
my $file_age = timelocal(0, 0, 0, $day, $mon-1, $year);
unlink $file if $file_age < $t_crit;
}
Reply to: