mklink.pl 1.5 KB
Newer Older
1 2 3 4 5 6
#!/usr/local/bin/perl

# mklink.pl -- a faster substitute for mklink.sh.

# The first command line argument is a non-empty relative path
# specifying the "from" directory.
B
Bodo Möller 已提交
7 8
# Each other argument is a file name not containing / and
# names a file in the current directory.
9 10 11 12
#
# For each of these files, we create in the "from" directory a link
# of the same name pointing to the local file.
#
B
Bodo Möller 已提交
13 14
# We assume that the directory structure is a tree, i.e. that it does
# not contain symbolic links and that the parent of / is never referenced.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
# Apart from this, this script should be able to handle even the most
# pathological cases.

my $from = shift;
my @files = @ARGV;

my @from_path = split(/\//, $from);
my $pwd = `pwd`;
chop($pwd);
my @pwd_path = split(/\//, $pwd);

my @to_path = ();
foreach my $dirname (@from_path) {

    # In this loop, @to_path always is a relative path from
    # @pwd_path (interpreted is an absolute path) to the original pwd.

    # At the end, @from_path (as a relative path from the original pwd)
    # designates the same directory as the absolute path @pwd_path,
    # which means that @to_path then is a path from there to the original pwd.

    next if ($dirname eq "" || $dirname eq ".");

    if ($dirname eq "..") {
	@to_path = (pop(@pwd_path), @to_path);
    } else {
	@to_path = ("..", @to_path);
	push(@pwd_path, $dirname);
    }
}

my $to = join('/', @to_path);

foreach my $file (@files) {
#    print "ln -s $to/$file $from/$file\n";
    symlink("$to/$file", "$from/$file");
    print $file . " => $from/$file\n";
}