#!/usr/bin/perl =pod Copy one of our perls in installed-perls to some place where we really like to use it, say /usr/local. And correct every occurrence of the miserable path we gave it within installed-perls to the new location. Including, but not limited to the perl binaries and libperl.so and whatever binary file is there. I started out with find /home/src/perl/repoperls/installed-perls/perl/pb0yHi3/perl-5.8.0@26561 -type f | xargs perl -nle 'if (m|/home/src/perl/repoperls/installed-perls/perl/pb0yHi3| &&!$seen{$ARGV}++) {printf "%d %s\n", -T $ARGV, substr($ARGV,45)}' to determine which files I had to modify how to get a perl from one path to another. =cut use strict; use warnings; use File::Rsync; use File::Find; use File::Path qw(mkpath); use File::Spec; sub Usage { "Usage: $0 from_dir to_dir\n"; } my($from,$to) = @ARGV; die Usage unless $to; for ($from, $to) { s|/+$||; } die "to[$to] must be shorter than from[$from]" unless length($to) < length($from); mkpath $to; for ($from, $to) { die "dir[$_] not found" unless -e $_; die "dir[$_] not a directory" unless -d _; die "dir[$_] not absolute" unless File::Spec->file_name_is_absolute($_); } my $rsync = File::Rsync->new({ archive => 1}); $rsync->exec({src => "$from/", dest => "$to/"}) or die; find( { wanted => sub { my $rel = substr($_,length($from)); return unless $rel; return if -d $_; open my $fh, $File::Find::name or die "Could not open '$File::Find::name': $!"; my $To = File::Spec->catfile($to,$rel); open my $tofh, ">", $To or die "Could not open >'$To': $!"; if (-T $fh) { local $/ = "\n"; while (<$fh>) { s/\Q$from\E/$to/g; print $tofh $_; } } else { local $/; local $_ = <$fh>; s/\Q$from\E([^\0]+)/ $to . $1 . ("\0"x(length($from)-length($to))) /ge; print $tofh $_; } close $fh; close $tofh; }, no_chdir => 1, }, $from );