#!/usr/bin/perl use strict; use warnings; # Script to archive the financial data from the previous year use Time::Piece; use File::Basename; use File::Find::Rule; # find all the subdirectories of a given directory # http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README use File::Path qw(make_path remove_tree); #use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove); use File::Copy::Recursive qw(dircopy); use List::MoreUtils qw(uniq); use File::DirCompare; use Data::Dumper; my $now = localtime; my $year = $now->year; print "Year is $year\n"; # Get year to archive from current year my $lastyear = $now->add_years(-1)->year; print("Last year was $lastyear\n"); # Define and create folders my (%files1, %files2); my $financial_folder = '/home/tracey/Documents/financial/current_year/'; my $financial_archive_folder = '/home/tracey/Documents/financial/1_financial_archives/'; my $lastyear_folder = $financial_archive_folder . $lastyear . 'FinancialArchives'; my @folders = ( $financial_folder, $financial_archive_folder, $lastyear_folder ); =begin comment # Will be using this kind of thing to get only files with current year for deletion foreach my $folder ( @folders ) { if ( -d $folder ) { print("Folder exists: $folder\n"); } unless( -d $folder ) { print("Creating the folder \"$folder\"\n"); die "Could not create directory! $!" unless make_path($folder); } } # Get current folder list for nonempty directories my $find_rule = File::Find::Rule->new; $find_rule->nonempty->maxdepth(1)->mindepth(1)->relative; my @curr_subdirs = $find_rule->directory->in( $financial_folder ); =end comment =cut print("Copying current directories to archive folder\n"); print("From: $financial_folder\n"); print("To: $lastyear_folder\n"); dircopy( $financial_folder, $lastyear_folder ) or die $!; # Make sure contents match my $same = compare_dirs( $financial_folder, $lastyear_folder ); print("The value of same is $same\n"); die "Error: The folders are not the same!" unless ($same == 1) ; # Delete all files from current year from archive folders delete_dirs( $financial_folder, $lastyear_folder, $year, $lastyear ); # compare new directories to old directories to make sure they are the same sub compare_dirs { my ( $dir1, $dir2 ) = @_; my $same = 1; print("Making sure the copy was complete and all files match\n"); File::DirCompare->compare($dir1, $dir2, sub { my ($a, $b) = @_; if (! $b) { printf "Only in %s: %s\n", dirname($a), basename($a); $same = 0; } elsif (! $a) { printf "Only in %s: %s\n", dirname($b), basename($b); $same = 0; } else { print "Files $a and $b differ\n"; $same = 0; } }); print("Diff of directories done\n"); return $same; } # Delete old files sub delete_dirs { my ( $new_dir, $old_dir, $curr_year, $last_year ) = @_; print("Deleting files from current year in archives\n"); print("and files from last year from current folder\n"); # print("New dir in the delete_dirs is $new_dir\n"); # print("Old dir in the delete_dirs is $old_dir\n"); # For all files in archive dir that are newer than last year delete them # my $find_rule = File::Find::Rule->new; # # $find_rule->nonempty->maxdepth(5)->mindepth(1)->relative; # $find_rule->name('*.' . $lastyear . '*'); # my @curr_subdirs = $find_rule->directory->in( $new_dir ); # print("These are the current subdirs in delete_dirs\n\n"); # print Dumper(\@curr_subdirs); # foreach my $subdir(@curr_subdirs) { # print("Directory in current subdir is $subdir"); my @last_year_files = File::Find::Rule->file() ->name("*$curr_year*") ->in($old_dir); #print("These are the current files in last year folders in delete_dirs\n\n"); #print Dumper(\@last_year_files); my $num_files = scalar(@last_year_files); print("Number of current files in last year folders in delete_dirs: $num_files\n\n"); # For all file in current folder that are older than this year delete them return; }