Tony Heal wrote:
> OK I am probably missing something stupid, but I can not get this to work.
> The output should be 'Daily-{day of week)-{MMM}-{DD}-{}' for Sunday
> thru Friday and 'Weekly-{1|2|3}-{day of week)-{MMM}-{DD}-{} for
> Saturday and every fourth Saturday should start rotating months
> 'Month-{1|2|3}-{day of week)-{MMM}-{DD}-{}
>
> Anyone got any ideas?
>
> Oh, there is some code at the front that changes the system date from May
> 1 to 31
[ Whitespace adjusted to aid legibility. ]
> #!/usr/bin/perl
> use warnings;
> use strict;
> my $today = `date +%m%d%H%M`;
Why call an external program to do something that you can do in perl:
my @today = ( localtime )[ 4, 3, 2, 1 ];
$today[ 0 ]++;
my $today = sprintf '%02d%02d%02d%02d', @today;
Or:
use POSIX 'strftime';
my $today = strftime '%m%d%H%M', localtime;
> my $count = "501";
> while ( $count lt 532 ) {
> my $that = "0$count" . "2100";
Do you want to use strings or numbers?
For strings:
for ( '0501' .. '0531' ) {
my $that = $_ . '2100';
For numbers:
for ( 501 .. 531 ) {
my $that = sprintf '%04d2100', $_;
> system("date $that");
The date command changes the *system* date! In other words, this change
will effect all other programs running on your system. Do you really want
to do that?
> my $backupBaseDir = '/gfsbackup';
> my $logFile = "$backupBaseDir\/gfs_backup.log";
You don't have to escape the slash in a double quoted string.
> my $scpCMD = 'scp -i /usr/backup/.ssh/haddock';
And here you have a double quoted string without escaped slashes.
> my $backupDir = gfsBackup();
> my @ePaceServers = ("silverfish", "catfish", "bonefish");
> if ( ! -d $backupBaseDir )
> {
> mkdir $backupBaseDir;
> }
> sub gfsBackup
Subroutines in perl are package variables so there is no point defining them
inside a loop.
> {
> my ( $sec, $min, $hour, $mday, $mon, $yearOffset, $wday, $yday,
$isdst ) = localtime( time );
> my $year = $yearOffset + 1900;
> my ( $weeksec, $weekmin, $weekhour, $weekmday, $weekmon,
$weekyearOffset, $weekwday, $weekyday, $weekisdst ) = localtime( time - (
84600 * 8 ) );
> my $weekyear = $weekyearOffset + 1900;
> my ( $msec, $mmin, $mhour, $mmday, $mmon, $myearOffset, $mwday,
$myday, $misdst ) = localtime( time - ( 84600 * 29 ) );
> my $myear = $yearOffset + 1900;
Shouldn't that be:
my $myear = $myearOffset + 1900;
> my $week = int( $yday / 7 );
> my $sevendays = ( time - ( 84600 * 7 ) );
> my @days =
( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
);
> my @months =
( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov",
"Dec" );
> my ( $directory, @dir, $month, $gfsDir, $DatedgfsDir, $monthDirectory,
@monthDir, $lastWeek, $dirtemp );
The only variable you need to declare at this level is:
my $gfsDir;
> if ( $days[$wday] =~ "Saturday" )
Why not more simply:
if ( $wday == 6 ) # 6 = Saturday
> {
> opendir( DIR, $backupBaseDir );
You should *always* verify that the directory opened correctly:
opendir DIR, $backupBaseDir or die "Cannot open '$backupBaseDir' $!";
> my @readdir = readdir( DIR );
> closedir( DIR );
> while ( <@readdir> )
That is the same as:
while ( glob "@readdir" )
Which means that you are globbing the file names that you just got from
readdir so you are now reading the directory contents a second time. This
will *not* work correctly if any of the file names contain whitespace or
glob meta-characters.
What you want is:
for my $directory ( @readdir )
> {
> $directory = $_;
> print "directory = $directory\n";
> if ( $directory =~ "$months[$weekmon]-$weekmday-$weekyear" )
> {
> @dir = split( /-/, $directory );
my @dir = split( /-/, $directory );
> if ( $dir[0] =~ "Monthly" )
Shouldn't that be:
if ( $dir[0] eq 'Monthly' )
> {
> $gfsDir = "Weekly-1";
> }
> if ( $dir[0] =~ "Weekly" )
Shouldn't that be:
if ( $dir[0] eq 'Weekly' )
> {
> if ( $dir[1] lt 3 )
if ( $dir[1] < 3 )
> {
> my $weekcount = $dir[ 1 ] + 1;
> $gfsDir = "Weekly-$weekcount";
> }
> if ( $dir[1] eq 3 )
if ( $dir[1] == 3 )
> {
> my $monthcount = `ls $backupBaseDir |
grep "$months[$mmon]-$mmday-$myear" | cut -d- -f2`;
No need to call three external programs to do what you can do in perl:
my ( $monthcount ) = map +( split /-/ )[ 1 ],
<$backupBaseDir/*$months[$mmon]-$mmday-$myear*>;
> if ( $monthcount eq "13" )
This will *never* match! If the backquotes return '13' then $monthcount
will contain "13\n" and it will not match '13'.
> {
> $gfsDir = "Monthly-1";
> }
>