#! /usr/bin/perl use strict; use warnings; use Date::Calc qw(Add_Delta_Days Add_Delta_YM Today); use File::Spec; use File::Basename (); use POSIX; use FindBin; my $doDelete = 1; my $directory = File::Spec->catdir( qw[ / sc backup] ); my $bin = File::Basename::basename( $0 ); my $logfile = File::Spec->catfile( $FindBin::Bin, "$bin.log" ); my @files = _get_filenames( $directory ); @files = _clean_list( @files ); getFreeSpace( $logfile ); _delete_files( $directory, $logfile, @files ); getFreeSpace( $logfile ); ### # Subroutines ### sub _get_filenames{ my ($dir) = @_; opendir my $dirh, $dir or die $!; my @files = grep{ /^\w+\_\d{8}-\d{6}\.tar\.gz$/ }readdir $dirh; closedir $dirh; return @files; } sub _clean_list{ my @files = @_; my @dates; my @today = Today(); # keep today's files push @dates, sprintf "%04d%02d%02d", @today; # keep files of 5 last days for (1..4) { push @dates, sprintf "%04d%02d%02d", Add_Delta_Days( @today, $_ * -1 ); } # keep files of 11th, 21st of the last 6 months for (0..5){ my ($year,$month,$day) = Add_Delta_YM( @today, 0, $_ * -1 ); for( 11, 21 ){ push @dates, sprintf "%04d%02d%02d", $year,$month, $_; } } # filter filenames @files = grep{ my ($f) = $_ =~ /^\w+\_(\d{8})/; !( grep{ $f == $_ }@dates or $f =~ /01$/ ) }@files; } sub _delete_files{ my ($dir,$log,@files) = @_; open( my $fh_log, '>>', $log ) or die $!; for my $file ( sort @files ){ my $time = POSIX::strftime( '%Y%m%d-%H%M%S', localtime); my $fqfn = File::Spec->catfile( $dir, $file ); if( $doDelete ) { unlink $fqfn and print $fh_log $time,"\t",$file,"\n"; } # if else { print "Simulate: file '$file' would have been deleted\n"; } } close $fh_log; } # _delete_files sub getFreeSpace { my( $log ) = @_; my @space = `df -k`; open( my $fh_log, '>>', $log ) or die $!; print $fh_log "\n# Free space:\n"; foreach my $line ( @space ) { print $fh_log "# $line"; } close $fh_log; } # getFreeSpace