如何解决Perl中的符号链接?

时间:2009-09-03 12:03:29

标签: perl symlink

我有一个符号名称​​ java jre jre1.5 jre1.6 java1.5 java1.6 将指向相应的目录。考虑到第一个例子,它看起来像:

   java -> /usr/java/jdk1.5.x.x

我的目标如下:

  1. 检查符号是否存在
  2. 获取指向的目录的值
  3. 使用正则表达式而不是在代码中使用if-else语句。
  4. 该链接位于 / usr / tmp

    我在Perl中编写了一些代码,如下所示:

     $filename = "/usr/local/java";
     if (-l $filename) {
            print "File exists \n";
     } else {
            print "Not \n";
     }
    

    但是如果 java 不存在而且 java1.4 java1.5 存在,我想搜索哪个应该以 java ,是一个符号链接。

    此外,我需要获取它指向的目录。请告知如何继续。

3 个答案:

答案 0 :(得分:10)

首先,您确定不想使用${JAVA_HOME}环境变量吗?

您可以使用内置readlink()函数读取符号链接目标。

要检查其他可能性,您可以对它们进行硬编码并逐个检查是否存在,使用opendir() / readdir()内置或目标IO::Dir来查找目录中的所有符号链接并检查它们是否匹配或模式,甚至是glob()函数,在您的情况下可能更简单。

答案 1 :(得分:7)

use Cwd 'abs_path';

$absFilePath = abs_path("$linkPath") ;

答案 2 :(得分:0)

以下是链接文件或软链接文件的解决方案。以下代码段将通过递归解析所有链接来提供链接的原始文件

#!/usr/bin/perl

use warnings;
use strict;

use File::Basename;

my $file='/dev/mapper/vg_ms1-lv_root'; #this should be your input
my $myCwd =`pwd`;
chomp($myCwd);

while ( -l $file ) {
    my $readLnk=readlink( $file );
    #print "$readLnk\n";
    my $directory = dirname( $file );
    my $fileName = basename( $file ); #not doing anything with this name
    #print "$directory\n";
    chdir($directory);
    my $linkPDir = dirname( $readLnk );
    chdir($linkPDir);
    my $next_file = basename( $readLnk );
    my $curDir=`pwd`;
    chomp($curDir);
    $file="$curDir"."/"."$next_file";
}

print "$file\n";
chdir($myCwd);