如何在Perl中解析符号链接?
我有一个符号名java或jre或jre1.5或jre1.6或java1.5或java1.6,它将指向相应的目录。考虑到第一个实例,它将如下所示:如何在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 -> /usr/java/jdk1.5.x.x
我的目标如下:
$filename = "/usr/local/java";
if (-l $filename) {
print "File exists \n";
} else {
print "Not \n";
}
$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()
内置或objectiveIO::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()
不会递归解析符号链接。因此,您无法知道它所指向的路径是否是另一个符号链接。