I'm having a problems 'seeing' data located on an automount directory. I have tried opendir/closedir as well as glob. Both methods report that the directory is empty, however the os command find will report the data expected.
Of course the short term fix is to use find, however I've found that the options for it very between operating sytems.
Others have suggested that I try to open a file on the target operating system before using opendir/closedir or glob however I haven't had any luck getting that to work.
Here is my sample code, which will run on Linux. The three alternative implementations are located in functions getDirs1, getDirs2 and getDirs3
NOTE: you will need to select a directory that is automounted ($mountpoint) and a regex for a file ($probepoint) that is located on that mountpoint.
Of course, if you run this on a directory that isn't automounted, all three tests should succeed.
If anyone has any suggestions on how to get this to work, please let me know!
use strict;
use File::Find;
use Carp;
use Benchmark;
use Test::More tests => 3;
my $mountpoint = '/mnt/foofoo';
my $probepoint = qr/^3/;
#my $mountpoint = '/tmp';
#my $probepoint = qr/^G/;
ok(globMethod(), 'glob Method');
ok(opendirMethod(), 'opendir Method');
ok(osFindMethod(), 'OS Find Method');
sub globMethod
{
my $dirs = getDirs1($mountpoint);
#probe for known directory
return(scalar(grep(/$probepoint/, @$dirs)) == 1);
}
sub opendirMethod
{
my $dirs = getDirs2($mountpoint);
return(scalar(grep(/$probepoint/, @$dirs)) == 1);
}
sub osFindMethod
{
my $dirs = getDirs3($mountpoint);
return(scalar(grep(/$probepoint/, @$dirs)) == 1);
}
sub getDirs1
{
my $root = shift;
my $whackFile = "$root/Volume_Inventory.xml";
my @dirs = grep { $_ !~ /^\./ &&
-d "$_" }
glob("$root/*");
@dirs = map {s|^$root/||; $_;} @dirs;
return \@dirs;
}
sub getDirs2
{
my $root = shift;
my @dirs;
if(not opendir(DH, $root))
{
croak "Could not open dir: $root ($!)";
}
@dirs = grep { /^[^\.]/ &&
-d "$root/$_" }
readdir(DH);
closedir DH;
return \@dirs;
}
sub getDirs3
{
my $root = shift;
my $cmd = "find $root -maxdepth 1 -follow -type d";
my @dirs = grep {chomp &&
$_ !~ /^\./ &&
$_ !~ /^$root$/ &&
-d $_}
`$cmd`;
@dirs = map {s|^$root/||; $_;} @dirs;
return \@dirs;
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|