#!/usr/bin/perl -w # ****************************************************************** # Author: Chad Elliott # Date: 7/6/2001 # Description: Recreate/rename symbolic links. # ****************************************************************** use strict; use File::Basename; sub showHelp { my($name) = basename($0); print STDERR "Usage: $name [-r] " . " [files...]\n\n" . " -r recurse down directories\n" . " $name will not recurse any directory if -r is not given\n" . " even if a directory name is given as one of the files\n"; } sub convertFile { my($fileName) = shift; my($prefix) = shift; my($changeTo) = shift; my($recursive) = shift; my($retval) = 0; if (-l $fileName || -e $fileName) { my($linkContents) = readlink($fileName); if (defined $linkContents) { if (substr($linkContents, 0, length($prefix)) eq $prefix) { my($newLink) = "$changeTo/" . substr($linkContents, length($prefix)); unlink($fileName); $newLink =~ s!//!/!g; symlink($newLink, $fileName); } } elsif ($recursive && -d $fileName) { if (opendir(DD, $fileName)) { foreach my $file (grep(!/^\.\.?$/, sort(readdir(DD)))) { my($constructed) = "$fileName/$file"; $retval += convertFile($constructed, $prefix, $changeTo, $recursive); } closedir(DD); } else { $retval++; } } } else { $retval++; } return $retval; } my($i) = 0; my($retval) = 0; my($recursive) = 0; my($foundPrefix) = 0; my($foundChangeTo) = 0; my($prefix) = ""; my($changeTo) = ""; for($i = 0; $i <= $#ARGV; $i++) { if ($ARGV[$i] eq '-r') { $recursive = 1; } elsif ($ARGV[$i] eq '-h') { showHelp(); exit(0); } elsif ($ARGV[$i] =~ /^\-/) { print STDERR "Unknown option -- $ARGV[$i]\n"; exit(1); } elsif (!$foundPrefix) { $foundPrefix = 1; $prefix = $ARGV[$i]; } elsif (!$foundChangeTo) { $foundChangeTo = 1; $changeTo = $ARGV[$i]; } else { ## rest must be files last; } } if (!$foundPrefix || !$foundChangeTo) { showHelp(); exit(1); } if ($i == $#ARGV + 1) { if ($recursive) { $retval += convertFile(".", $prefix, $changeTo, $recursive); } } else { for( ; $i <= $#ARGV; $i++) { $retval += convertFile($ARGV[$i], $prefix, $changeTo, $recursive); } } exit($retval);