#!/usr/bin/env perl use strict; use warnings; use File::Find; use Cwd; my @dirs = grep { /^\// && -d } split(/:/, $ENV{PATH}), qw( /bin /usr/bin /usr/sbin /usr/libexec /usr/local/bin /usr/local/sbin /usr/local /opt ); my %path = map { $_ => locate($_, @dirs) } @ARGV; mkdir 'bin.sys' or die "bin.sys: $!" if not -d 'bin.sys'; foreach my $tool (keys %path) { next if not defined $path{$tool}; print "$tool $path{$tool}\n"; unlink "bin.sys/$tool"; symlink $path{$tool}, "bin.sys/$tool" or warn "bin.sys/$tool -> $path{$tool}: $!\n"; } sub locate { my ($tool, @dirs) = @_; # use die to break out of the find as soon # as we found it my $cwd = cwd; eval { find( sub { return unless $tool eq $_ and -x $_ and -f _; die { found => $File::Find::name }; }, @dirs ); }; chdir $cwd; return (ref $@ eq ref {} and $@->{found}) ? $@->{found} : undef; }