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

Hi Friends,

I am new to perl. I am trying to work on a perl script which will delete only those files on a particular path which are older than 7 days in terms of accessed date of the files. However, it seems not working. But, when i put a condition "M" it does work for a modified date condition. Below is the code. Please suggest what should I do. Thanks for your help and suggestion.

#!/usr/local/bin/perl-w my $username = getlogin; my $userpath = "C:/Users/$username/AppData/Local/Temp/Data"; print $username; opendir (DIR, "$userpath") || die ("Unable to open directory"); @files=readdir(DIR); closedir(DIR); foreach $file (@files) { if (-A "$userpath/$file" > 7) { print ("$file\n"); print $userpath."/".$file; unlink $userpath."/".$file; print "File deleted successfully\n"; } }
  • Comment on Script to delete only those files on a path whose accessed date is more than 7 days
  • Download Code

Replies are listed 'Best First'.
Re: Script to delete only those files on a path whose accessed date is more than 7 days
by Athanasius (Archbishop) on Aug 13, 2012 at 08:08 UTC

    Hello abhi_perl, and welcome to the Monastery!

    Your script is OK (apart from the absence of use strict, of course!). The problem seems to be a — well, shall we say, an eccentricity — of Windows: a file access does not (by default) change the “date accessed” attribute of the file.

    A Google search on “ Windows "date accessed" ” brought up this link: http://www.vistaheads.com/forums/microsoft-public-windows-vista-file-management/176698-date-accessed-attribute-not-updating.html. Following the advice there — i.e., changing one registry setting and rebooting — fixed the problem on my system. With this change, your script should work as expected.

    A tip: in situations like this, put in print statements to find out what Perl is actually seeing. I used:

    foreach my $file (@files) { printf "-A %s = %d\n", $file, -A "$userpath/$file"; printf "-M %s = %d\n", $file, -M "$userpath/$file"; }

    from which it was obvious that the “access date” attribute was mostly the same as the “modified date” attribute. This was easily confirmed via Windows Explorer.

    HTH,

    Athanasius <°(((><contra mundum

      Hi Athanasius

      Thanks for your note. But I am not using Windows Vista. I am working on Windows 9. Also, I tested the script on mac OS also but still the script seems going somewhere wrong. Can you please suggest if there is any other alternative to delete the files whose accessed dates are last 7 days. I need to have this script running on both OS

      Thanks

      Abhishek

Re: Script to delete only those files on a path whose accessed date is more than 7 days
by aitap (Curate) on Aug 13, 2012 at 08:11 UTC

    Try warning these access times before checking or view them in debugger (perl -d) using x command (see perldoc warn and perldoc perldebug for more). Perhaps they are really less than 7 days.

    Also, it is highly recommended to use warnings; use strict; in all scripts greater than several lines.

    Edit: fix typo, add link

    Sorry if my advice was wrong.
Re: Script to delete only those files on a path whose accessed date is more than 7 days
by Anonymous Monk on Aug 13, 2012 at 08:29 UTC

    However, it seems not working

    How do you know?