http://qs1969.pair.com?node_id=504660

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

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; }

Hazah! I'm Employed!