[ Date Index ] [ Thread Index ] [ <= Previous by date / thread ] [ Next by date / thread => ]
Jamie Andrews wrote: > Simon's solution is pretty good. How about Steve's? :) Here, however is a version that does files too First argument is dir, second is optional file. No args is "from here". I appologise for line 28 (with the comment), it's a terrible bit of code. But there is no way of stopping the Find that I can see without calling an exit or an eval with an exit which is awful. #! /usr/bin/perl use File::Find; my ($dir,$file) = @ARGV; $dir ||= '.'; if ($file) { my @files = findlinkstofile($dir,$file); print map { "$_\n" } @files; } else { my %groups = findlinksindir($dir); print map { "@$_\n" } values %groups; } sub findlinkstofile { my ($dir,$file) = @_; my ($finode,$fnlinks) = (lstat($file))[1,3]; return $file if $fnlinks == 1; my @files; File::Find::find(sub { return if $fnlinks == 0; # this is rubbish my ($inode,$nlink) = (lstat($_))[1,3]; return unless $inode == $finode; push(@files, $File::Find::name); $fnlinks--; }, $dir); return @files; # though this would be odd } sub findlinksindir { my ($dir) = @_; my %groups; File::Find::find(sub { my ($inode,$nlink) = (lstat($_))[1,3]; return unless -f && $nlink > 1; push(@{$groups{$inode}}, $File::Find::name); }, $dir); return %groups; } -- The Mailing List for the Devon & Cornwall LUG http://mailman.dclug.org.uk/listinfo/list FAQ: http://www.dcglug.org.uk/linux_adm/list-faq.html