File::Find::Parallel

File::Find::Parallel allows you to traverse a number of similar directories in parallel.
Download

File::Find::Parallel Ranking & Summary

Advertisement

  • Rating:
  • License:
  • Perl Artistic License
  • Price:
  • FREE
  • Publisher Name:
  • Andy Armstrong
  • Publisher web site:
  • http://search.cpan.org/~andya/

File::Find::Parallel Tags


File::Find::Parallel Description

File::Find::Parallel allows you to traverse a number of similar directories in parallel. File::Find::Parallel allows you to traverse a number of similar directories in parallel.SYNOPSIS use File::Find::Parallel; my $ffp = File::Find::Parallel->new( qw( /foo /bar ) ); print "Union:n"; my $union = $ffp->any_iterator print " $_n" while $_ = $union->(); print "Intersection:n"; my $inter = $ffp->all_iterator print " $_n" while $_ = $inter->();File::Find is the ideal tool for quickly scanning a single directory. But sometimes it's nice to be able to perform operations on multiple similar directories in parallel. Perhaps you need to compare the contents of two directories or convert files that are shared in more than one directory into hard links.This module manufactures iterators that visit each file and directory in either the union or the intersection of a number of directories. Hmm. What does that mean?Given two directory trees like this foo foo/a foo/b/c foo/d bar bar/a bar/b bar/eyou can choose to work with the intersection of the two directory structures: . ./a ./bThat is the subdirectories and files that the foo and bar share.Alternately you can work with the union of the two directory structures: . ./a ./b ./b/c ./d ./eStill not clear? Well, if you wanted to do a recursive diff on the two directories you'd iterate their union so you could report files that were present in foo but missing from bar and vice-versa.If, on the other hand you wanted to scan the directories and find all the files that are common to all of them you'd iterate their intersection and receive only files and directories that were present in all the directories being scanned.The any_iterator and all_iterator are built on a more general purpose method: want_iterator. If, for example, you want to make links between files that are found in more than one directory you might get your iterator like this: my $iter = $ffp->want_iterator( 2 );The apparently magic '2' reflects the fact that if you're going to be making links you need at least two files. No matter how many directories you are iterating over in parallel you will only see files and directories that appear in at least two of those directories.File::Find::Parallel can scan any number of directories at the same time. Here's an example (on Unix systems) that returns the list of all files and directories that are contained in all home directories. use File::Glob ':glob'; use File::Find::Parallel; my $find = File::Find::Parallel->new( bsd_glob( '/home/*' ) ); my @common = ( ); my $iter = $find->all_iterator; while ( defined my $obj = $iter->() ) { push @common, $obj; } print "The following files are common to ", "all directories below /home :n"; print " $_n" for @common;For a complete concrete example of its use see lncopies in the bin subdirectory of this distribution.IteratorsThe iterator returned by any_iterator, all_iterator or want_iterator is a code reference. Call it to get the next file or directory. When all files and directories have been returned the iterator will return undef.Once created an iterator is independent of the File::Find::Parallel object that created it. If the object goes out of scope and is destroyed during the life of the iterator it will still function normally.You may have many active iterators for a single File::Find::Parallel object at any time. Requirements: · Perl


File::Find::Parallel Related Software