#! /usr/bin/perl use strict; use warnings; use DateTime; use File::Copy; use File::Find; use File::stat; use Time::localtime; use File::Spec::Functions qw( catdir catfile ); my $now = DateTime->now( time_zone => 'floating' ); my $yesterday = $now->substract( days => 1 ); my $year = $yesterday->year; my $month = $yesterday->month; my $month_abbr = uc( $yesterday->month_abbr ); my $day = $yesterday->day; my $year_abbr = substr $year, 2, 2; my $mdy = $now->strftime( "%m-%d-%y" ); print "$year\t$year_abbr\t$month\t$month_abbr\t$day\n"; my $basedir = '/Users/mgavi.brathwaite/Desktop/BioinfDev/SequenceAssemblyProject'; my $root = catdir( $basedir, "Sequencing_Results/Results $year/New Version/Amanda Li/$month_abbr" ); my $komp_dir = catdir( $basedir, 'KOMP' ); #> sub routines #> ------------------------------------------------------------ sub wanted { # return if current filename ends with 'xls' return if $File::Find::name =~ m/xls\z/; # return if file is younger than 1 day return if -M $File::Find::name > 1.0; # determine maid number if ( my ( $maid ) = $File::Find::name =~ m{/(\d*)} ) { # store full path to file if maid number could be determined; see: "perldoc perldsc", Hashes of Arrays push @{ $files{$maid} }, $File::Find::name; } } sub maid_dirs { my ( $maid ) = @_; my @dirs = glob( catfile( $komp_dir, '*' ) ); for my $dir ( @dirs ) { return $dir if -d $dir and $dir =~ m{/$maid\D}; } # if no suitable dir was found return undef; } #> main script #> ------------------------------------------------------------ # determine files my %files; find( \&wanted, $root ); for my $maid ( keys %files ) { my @files = @{ $files{$maid} }; next if @files != 4; if ( my $dest_dir = maid_dirs( $maid ) ) { my $directory = catdir( $dest_dir, 'sequencing' ); mkdir( $directory, 0755 ) or die "mkdir failed: $!\n"; for my $file ( @files ) { copy( $file, catfile( $directory, $file ) ) or die "copy failed: $!\n"; } } } print "Job done\n";