代码之家  ›  专栏  ›  技术社区  ›  PJ.

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

  •  3
  • PJ.  · 技术社区  · 17 年前

    我有个象征性的名字 爪哇 JRE JRE1.5 JRE1.6 Java1.5 Java1.6 这将指向相应的目录。考虑到第一个实例,它看起来像:

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

    我的目标是:

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

    链接将在 /Ur/TMP .

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

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

    但万一 爪哇 不存在,而是 Java1.4 Java1.5 我要搜索的内容应该从 爪哇 是一个象征性的链接。

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

    3 回复  |  直到 17 年前
        1
  •  10
  •   Michał Górny    17 年前

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

    您可以使用内置的来读取symlink目标 readlink() 功能。

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

        2
  •  7
  •   Aleksander Blomskøld    13 年前
    use Cwd 'abs_path';
    
    $absFilePath = abs_path("$linkPath") ;
    
        3
  •  0
  •   Shan    12 年前

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

    #!/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);