4

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

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

我的目标如下:

  1. 检查符号是否存在
  2. 获取它指向的目录的值
  3. 在代码中使用正则表达式而不是使用 if-else 语句。

该链接将在/usr/tmp中。

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

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

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

我还需要获取它指向的目录。请告知如何进行。

4

3 回答 3

12

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

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

要检查其他可能性,您可以将它们全部硬编码并一一检查是否存在,使用opendir()/ readdir()builtins 或 ObjectiveIO::Dir来查找目录中的所有符号链接并检查它们是否匹配或模式,甚至glob()在您的情况下可能更简单的函数.

于 2009-09-03T12:15:29.193 回答
11
use Cwd 'abs_path';

$absFilePath = abs_path("$linkPath") ;
于 2012-12-12T14:15:35.890 回答
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);
于 2013-12-23T20:54:33.810 回答