如何在Perl中解析符号链接?

如何在Perl中解析符号链接?,perl,symlink,Perl,Symlink,我有一个符号名java或jre或jre1.5或jre1.6或java1.5或java1.6,它将指向相应的目录。考虑到第一个实例,它将如下所示: java -> /usr/java/jdk1.5.x.x 我的目标如下: $filename = "/usr/local/java"; if (-l $filename) { print "File exists \n"; } else { print "Not \n"; } 检查符号是否存在 获

我有一个符号名java或jre或jre1.5或jre1.6或java1.5或java1.6,它将指向相应的目录。考虑到第一个实例,它将如下所示:

   java -> /usr/java/jdk1.5.x.x
我的目标如下:

 $filename = "/usr/local/java";
 if (-l $filename) {
        print "File exists \n";
 } else {
        print "Not \n";
 }
  • 检查符号是否存在
  • 获取它所指向的目录的值
  • 在代码中使用正则表达式而不是if-else语句
  • 链接将位于/usr/tmp中

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

     $filename = "/usr/local/java";
     if (-l $filename) {
            print "File exists \n";
     } else {
            print "Not \n";
     }
    
    但如果java不存在,而是存在java1.4或java1.5,我想搜索哪个应该从java开始,并且是一个符号链接


    我还需要得到它所指向的目录。请建议如何继续。

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

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


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

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

    use Cwd 'abs_path';
    
    $absFilePath = abs_path("$linkPath") ;
    
    #!/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);
    

    我确信我没有使用${JAVA_HOME}环境变量。关于检查,我们不能通过req-exp进行检查。如果您的意思是在对目录中的条目进行迭代时检查名称,那么可以使用regexp进行检查。但是我在这里使用regexp可能有点过分,因为您可以使用更简单的glob模式,比如:
    readlink()
    不会递归解析符号链接。因此,您无法知道它所指向的路径是否是另一个符号链接。