| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | #!/usr/bin/perl -w# vi: set ts=4:@LINKS=`find . -type l|LC_ALL=C xargs ls -l`;#print @LINKS;#$debug = 1;while($_ = shift @LINKS){	chomp;	my ($perm,$nlinks,$owner,$group,$size,$month,$day,$year,$file) =		split(' ', $_, 9);	my $link;	if($perm =~ m/^l/){		($relfile, $link) = split(' -> ', $file);	}	# chop off leading . in $file	$file = $relfile;	$file =~ s/^\.//;	if($perm =~ m/^l/){		my @pathcomponents = split('/', $file);		my @linkcomponents = split('/', $link);		if($link =~ m/^\//){			@newcomponents = @linkcomponents;		}else{			@newcomponents = @pathcomponents;			# chop off filename			pop(@newcomponents);			while($comp = shift @linkcomponents){				$debug && print "path: ",join(':',@newcomponents)," -- $comp -- ", join(':',@linkcomponents),"\n";				if($comp eq ""){					# ignore				}elsif($comp eq ".."){					pop(@newcomponents);				}else{					push @newcomponents,$comp;				}			}		}		if($newcomponents[0] eq ""){			shift(@newcomponents);		}		if($pathcomponents[0] eq ""){			shift(@pathcomponents);		}		#print "from ",join('/',@pathcomponents),"\n";		#print "to ",join('/',@newcomponents),"\n";		if($newcomponents[0] eq $pathcomponents[0]){			$debug && print $newcomponents[0],", ",$pathcomponents[0];			$debug && print "should be relative\n";			while($newcomponents[0] eq $pathcomponents[0]){				shift(@newcomponents);				shift(@pathcomponents);			}			while(@pathcomponents > 1){				shift(@pathcomponents);				unshift(@newcomponents,"..");			}		}else{			$debug && print "should be absolute\n";			unshift(@newcomponents,"");		}		$newlink=join('/',@newcomponents);		print "ln -sf $newlink $relfile\n";		unlink($relfile);		symlink($newlink,$relfile);	}}
 |