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

Hello,
I have a Linux "find" in my perl code that is run from the terminal. I would like to replace it with a perl version so that my code will be more portable.
This is the command I run: find -P $orig_dir -printf "%u;%U;%g;%G;%M;%y;%P;\n

I am using it to collect information about all items(links,directories,files) in a directory. I then go through the resulting array and put the results in a csv file.

Anybody know of a nice perl way of replacing that find?

Replies are listed 'Best First'.
Re: How to do Linux Find in Perl
by Fletch (Bishop) on Oct 26, 2010 at 15:48 UTC
Re: How to do Linux Find in Perl
by gman (Friar) on Oct 26, 2010 at 15:48 UTC

    with a little work you might be able to use find2perl, to create the shell of what you need in your script.

    Also take a look at File::Path

    Here is a snippet of something I use, I think I posted the complete program under Cool Uses

    sub rCopy { my $src = shift; my $dest = shift; $dest = $dest . ".zip"; #print "**** $src\n"; if( -f $src ) { # if file on unix also include -l from sym link #print "DEBUG: " . (stat($src))[9] . " - " . (stat($dest)) +[9] . "$dest\n"; if(-f $dest && (stat($src))[9] <= (stat($dest))[9]) { # target file exists and in older print "--- Skipping file $dest\n"; } else { my $zip = Archive::Zip->new(); my $file = $zip->addFile($src); print "+++ Createing Zip File $dest\n"; unless ($zip->writeToFileNamed($dest) == 0 ) { warn "--- Could + not create zip file\n"; }; #print "+++Coping file $src to $dest\n\r"; #copy $src, "$dest" || print "$!\n"; } } elsif( -d $src) { # $src is a directory, open dir read contents. my ($volume,$dir,$file) = File::Spec->splitpath( $src,1 ); if(! -d "$copy_to/$dir") { print "++++ Creating Dir: $copy_to/$dir\n"; eval { mkpath (["$copy_to/$dir"]); 1} or warn "Could not c +reate path $@\n\r"; } my $dh = undef; opendir( $dh, $src ); my @files = grep { (! /\.$/) } readdir($dh); foreach my $rSrc (@files) { #print "Calling rCopy($src\/$rSrc,$copy_to\/$dest\/$rSrc)\n\r" +; rCopy("$src" . "/$rSrc", "$copy_to/$dir/$rSrc"); #print "Skipping Dir: $src\n"; }
Re: How to do Linux Find in Perl
by JavaFan (Canon) on Oct 26, 2010 at 16:34 UTC
    I would like to replace it with a perl version so that my code will be more portable.
    Considering that find is both part of the POSIX toolbox, and part of the GNU shell (or file) utilities, I find it hard to imagine a platform on which perl runs, and where find doesn't.

    It's also part of busybox, making that find can be run on tiny systems, for which perl is too large.

      I don't think busybox find has a -printf option.

        Busybox doesn't have perl either.