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