Cara83 has asked for the wisdom of the Perl Monks concerning the following question:

Hi everyone, I am only new to this Perl programming world and I am having problems with the script I am writing. The program is supposed to search a number of specified directories for files with certain names or file type and that are older than 30 days and then move them to an archive folder. Once inside the archive folder, any files greater than 60 days are permanently deleted from the directory. The problem is I only want to process files with particular filenames and not others. No matter what way i write my code, it either sees every file and processes all files, even the ones I want to exclude, or it doesnt process any files. Can anyone help me on this??? I can post up my code if needed.... Any help is much appreciated guys!! Cheers Cara
  • Comment on Can't get my filename pattern matching working....can anyone help?!

Replies are listed 'Best First'.
Re: Can't get my filename pattern matching working....can anyone help?!
by marto (Cardinal) on Sep 05, 2007 at 10:04 UTC
Re: Can't get my filename pattern matching working....can anyone help?!
by dwm042 (Priest) on Sep 05, 2007 at 15:37 UTC
    The easiest approach is to get all files and throw away those filenames you don't want. This sample code doesn't do everything you would like but does show a throwaway method.

    #!/usr/bin/perl use warnings; use strict; use File::Basename; # # find all files in a directory that end in .txt and how old they are. # my $directory = shift; my $script = basename($0); die("USAGE: $script <target_directory> \n") unless (defined($directory)); my $file_pattern = qr/\.txt$/i; opendir DIR, $directory or die("Cannot open directory $directory\n"); while( my $file = readdir(DIR) ) { # # skip any file that does not satisfy our selection criterion. # next unless $file =~ $file_pattern; # # http://perldoc.perl.org/perlfunc.html for info # on -X functions. # my $age = -M $file; my $age_string = sprintf "%6.2f", $age; $age_string =~ s/^\s+//; printf "File %s is aged %s days.\n", $file, $age_string; if ( $age > 30.0 ) { print "move file $file here."; } } closedir(DIR);
    And the output is:

    C:\Code>perl find_old_txt_files.pl "C:/Code" File Challenging-Generals.txt is aged 4.84 days File Chasing-Clam.txt is aged 0.79 days. File GMvietnam.txt is aged 1.00 days. File Tap-Into-Melons.txt is aged 0.07 days. C:\Code>