Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 587
  • Last Modified:

Finding modified date of the file and moving file to folder in perl

Hi,

In perl how do I take the file modified date and create folder with name

archiveold/yyyy/MM/dd

suppose file modified date is 25-Oct-2010

If not exists then folders created should be

archiveold/2010/Oct/25

then I wanted to move the file to its relevant date folder

while (*.xml) {
  chomp;
  $file=$_ ;

  # suppose file modified date is 25-Oct-2010
  # create folders at path archiveold/2010/Oct/25 if dos not exists
  # move file in folder 'archiveold/2010/Oct/25'

}

Please guide
0
tia_kamakshi
Asked:
tia_kamakshi
  • 8
  • 5
1 Solution
 
ozoCommented:
use POSIX;
use File::Path qw(make_path);
while( <*.xml> ){
   my $path=strftime"archiveold/%Y/%m/%d",localtime((stat)[9]);
   make_path $path;
   rename $_,"$path/$_" or warn "$path/$_ $!";
}
0
 
tia_kamakshiAuthor Commented:
Hi,

Thanks for your code

When I am running my code below, then I am getting the error saying

"make_path" is not exported by the File::Path module
Can't continue after import errors at ./archiveFiles.pl line 4
BEGIN failed--compilation aborted at ./archiveFiles.pl line 4.


Please guide

Many Thanks
#!/usr/bin/perl

use POSIX;
use File::Path qw(make_path);


my $srcdir = "/home/dbali/config/";

opendir(DIR, $srcdir) or die "Can't open $srcdir: $!";
my @files = grep { /\.*$/i } readdir(DIR);

foreach my $file (@files) {
   my $path=strftime"archiveold/%Y/%m/%d",localtime((stat)[9]);
   make_path $path;
   rename $_,"$path/$_" or warn "$path/$_ $!";
}

Open in new window

0
 
ozoCommented:
What version of File::Path do you have?
does
use File::Path;
mkpath $path;
work?

Also, if you are using $file as your loop variable, then
localtime((stat)[9])
should be
localtime((stat "$srcdir/$file")[9]);
and
rename $_,"$path/$_"
should be
rename "$srcdir/$file","$path/$file";

also, /\.*$/i always matches, since all strings have zero or more "." before the end
so the grep is a noop

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
tia_kamakshiAuthor Commented:
Many Thanks for your reply

I need all types of files

what should I write instead of /\.*$/i  in my below code to list all files regardless of any extension.

But list should not folders and files in subdirectories

my @files = grep { /\.*$/i } readdir(DIR);


Many Thanks for your help
0
 
tia_kamakshiAuthor Commented:
Hi,

I have modified my code to below. It is giving me error saying

Use of uninitialized value in -d at /usr/share/perl/5.8/File/Path.pm line 143.
fileparse(): need a valid pathname at /usr/share/perl/5.8/File/Path.pm line 144


Also, please help me in fixing

I need all types of files

what should I write instead of /\.*$/i  in my below code to list all files regardless of any extension.

But list should not folders and files in subdirectories

my @files = grep { /\.*$/i } readdir(DIR);


Please guide

Thanks,

#!/usr/bin/perl

use POSIX;
use File::Path;
mkpath $path;

my $srcdir = "/home/dbali/config/";

opendir(DIR, $srcdir) or die "Can't open $srcdir: $!";
my @files = grep { /\.*$/i } readdir(DIR);

foreach my $file (@files) {
   my $path=strftime"archiveold/%Y/%m/%d",localtime((stat "$srcdir/$file")[9]);
   make_path $path;
   rename "$srcdir/$file","$path/$file";
}

Open in new window

0
 
ozoCommented:
to get all files, just use
my @files =  readdir(DIR);
to omit directories, use
grep{ !-d "$srcdir/$_"}  readdir(DIR);
to list only plain files, use
grep{ -f "$srcdir/$_"}  readdir(DIR);

mkpath $path; should be inside the loop after $path is defined, where you now have make_path $path;
since you told me that your version of File::Path does not export that name
0
 
tia_kamakshiAuthor Commented:
Many Thanks for your replies.

I am sorry for late response. I was out of station last week.

I will get back to you today on this. Once again appologise for late response
0
 
tia_kamakshiAuthor Commented:
Hi,

I have modified the code and it is giving me below error saying

dbali@pbms-tstva2:~$ ./archiveFiles.pl
Can't locate object method "make_path" via package "archiveold/2010/02/04" (perhaps you forgot to load "archiveold/2010/02/04"?) at ./archiveFiles.pl line 14.
dbali@pbms-tstva2:~$


Please find my updated code

Please guide

Many Thanks

#!/usr/bin/perl

use POSIX;
use File::Path;

my $srcdir = "/home/dbali/config/";

opendir(DIR, $srcdir) or die "Can't open $srcdir: $!";
my @files = grep{ !-d "$srcdir/$_"}  readdir(DIR);

foreach my $file (@files) {
   my $path=strftime"archiveold/%Y/%m/%d",localtime((stat "$srcdir/$file")[9]);
   mkpath $path;
   make_path $path;
   rename "$srcdir/$file","$path/$file";
}

Open in new window

0
 
ozoCommented:
Apparently, your version of File::Path has only mkpath not make_path.
So use mkpath not make_path
0
 
tia_kamakshiAuthor Commented:
Many Thanks.

Now my script is working good.

But my files are not moving to destination directory

Please guide
#!/usr/bin/perl

use POSIX;
use File::Path;

my $srcdir = "/home/dbali/config/";

opendir(DIR, $srcdir) or die "Can't open $srcdir: $!";
my @files = grep{ !-d "$srcdir/$_"}  readdir(DIR);

foreach my $file (@files) {
   my $path=strftime"archiveold/%Y/%b/%d",localtime((stat "$srcdir/$file")[9]);
   mkpath $srcdir.$path;
   rename "$srcdir/$file","$srcdir.$path/$file";
}

Open in new window

0
 
tia_kamakshiAuthor Commented:
I wanted to give a 100% points to ozo solution. By mistake request is gone for closure. Please allocate all 500 points to ozo.

Many Thanks
0
 
ozoCommented:
 mkpath $srcdir.$path;
rename "$srcdir/$file",$srcdir.$path."/$file";
or
rename "$srcdir/$file","$srcdir$path/$file";




0
 
tia_kamakshiAuthor Commented:
Please allocate all 500 points to Ozo or please let me know how do I do it????
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 8
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now