我有一个符号名称 java 或 jre 或 jre1.5 或 jre1.6 或 java1.5 或 java1.6 将指向相应的目录。考虑到第一个例子,它看起来像:
java -> /usr/java/jdk1.5.x.x
我的目标如下:
该链接位于 / usr / tmp 。
我在Perl中编写了一些代码,如下所示:
$filename = "/usr/local/java";
if (-l $filename) {
print "File exists \n";
} else {
print "Not \n";
}
但是如果 java 不存在而且 java1.4 或 java1.5 存在,我想搜索哪个应该以 java ,是一个符号链接。
此外,我需要获取它指向的目录。请告知如何继续。
答案 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);