4

それぞれのディレクトリを指すシンボリック名javaまたはjreまたはjre1.5またはjre1.6またはjava1.5またはjava1.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.4またはjava1.5が存在する場合は、 javaで始まり、シンボリックリンクであるものを検索したいと思います。

また、それが指しているディレクトリを取得する必要があります。進め方を教えてください。

4

3 に答える 3

12

まず、${JAVA_HOME}環境変数を使用したくないと思いますか?

組み込み関数を使用してシンボリックリンクターゲットを読み取ることができますreadlink()

他の可能性をチェックするには、それらすべてをハードコーディングして1つずつ存在するかどうかをチェックするか、 opendir()/readdir()ビルトインまたは目的を使用IO::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 に答える