Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

File::Find preprocess and sort issues

by chanakya (Friar)
on Jul 24, 2009 at 11:54 UTC ( [id://782943]=perlquestion: print w/replies, xml ) Need Help??

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

Geeting Monks,
We have some old code which I'm currently rewriting. As a part of that I need to read the files from
two directories, sort them based on creation time.

I have achieved this in the following way,
my @dirs2read = ("/tmp", "/u/files"); foreach my $sp_dir (@dirs2read) { opendir SP, $sp_dir or die "Cannot open $sp_dir for reading: $!"; my @files = map { $_->[1] } sort { $a->[0] <=> $b->[0]} map { [ stat("$sp_dir/$_")->ctime, $_] } grep { /\w/ && !/^TA\d{1,8}$/ && !/gz$/} readdir SP; closedir SP; }


I want to implement the same thing using File::Find preprocess(), I'm able to
read files from two directories and also able to sort them, but I'd like to sort the files
based on the file creation time. Please let me know how do I modify the code to suite my specified condition.
use File::Find; use Data::Dumper; my @directories = ("/u/files", "/tmp"); my @readfiles; File::Find::find({ preprocess => sub { sort { # Files sort before dirs (-f $a ? (-f $b ? $a cmp $b : -1 ) : (-f $b ? 1 : $a + cmp $b)) } @_ }, wanted => sub {push @readfiles, "$File::Find::dir/$_" +if (-f); } , postprocess => sub { rmdir $File::Find::dir }, }, @directories); print Dumper \@readfiles;
Thanks for your time in advance.

Replies are listed 'Best First'.
Re: File::Find preprocess and sort issues
by jwkrahn (Abbot) on Jul 24, 2009 at 14:52 UTC
    sort them based on creation time.

    ...

    map { [ stat("$sp_dir/$_")->ctime, $_] }

    ctime is NOT the creation time of a file.   On Unix and Linix file systems the creation time of the file is NOT stored anywhere.

    As the stat function says:

                    10 ctime    inode change time in seconds since the epoch (*)

                   (*) Not all fields are supported on all filesystem types. Notably, the ctime field is non-portable.  In particular, you cannot expect it to be a "creation time", see "Files and Filesystems" in perlport for details.

Re: File::Find preprocess and sort issues
by Anonymous Monk on Jul 24, 2009 at 12:31 UTC
    I dont get it, cant you write
    use File::Find; use Data::Dumper; my @directories = ("/u/files", "/tmp"); my @readfiles; File::Find::find({ preprocess => sub { sort { my @files = map { $_->[1] } sort { $a->[0] <=> $b->[0]} map { [ stat("$_")->ctime, $_] } grep { /\w/ && !/^TA\d{1,8}$/ && !/gz$/} @_; return @files }, wanted => sub {push @readfiles, "$File::Find::dir/$_" +if (-f); } , postprocess => sub { rmdir $File::Find::dir }, }, @directories); print Dumper \@readfiles;
      Thanks for the idea, I got the code working,
      use File::Find; use File::stat; use Data::Dumper; my @directories = ("/u/files", "/tmp"); my @readfiles; File::Find::find({ preprocess => sub { my @files = map { $_->[1] } sort { $a->[0] <=> $b->[0]} map { [ stat("$_")->ctime, $_] } grep { /\w/ && !/^TA\d{1,8}$/ && !/gz$/} @_; return @files }, wanted => sub {push @readfiles, "$File::Find::dir/$_" +if (-f); } , postprocess => sub { rmdir $File::Find::dir }, }, @directories); print Dumper \@readfiles;
        Correction sir, I got it working with the code I gave you. Sure it contained ideas, but I gave you working code :D

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://782943]
Front-paged by Arunbear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (2)
As of 2024-04-19 21:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found