Walks through one or more directories specified on command line, and fully expands any symbolic links within those directories to their real locations, taking into consideration all the relative and absolute symlinks that occur, recursively.
Originally written for a
Performance Computing/SysAdmin magazine Perl column. Go see there for a line by line description.
#!/usr/bin/perl -w
use strict;
$|++;
use File::Find;
use Cwd;
my $dir = cwd;
find sub {
return unless -l;
my @right = split /\//, $File::Find::name;
my @left = do {
@right && ($right[0] eq "") ?
shift @right : # quick way
split /\//, $dir;
}; # first element always null
while (@right) {
my $item = shift @right;
next if $item eq "." or $item eq "";
if ($item eq "..") {
pop @left if @left > 1;
next;
}
my $link = readlink (join "/", @left, $item);
if (defined $link) {
my @parts = split /\//, $link;
if (@parts && ($parts[0] eq "")) { # absolute
@left = shift @parts; # quick way
}
unshift @right, @parts;
next;
} else {
push @left, $item;
next;
}
}
print "$File::Find::name is ", join("/", @left), "\n";
}, @ARGV;