2

我正在寻找简单而正确的方法来获取符号链接的直接目标(不是最终目标)的绝对路径,在perl中。

我的示例树:

|-- dir1
|   |-- link1 -> ../dir2/link2
|-- dir2
|   `-- link2 -> ../dir3/file.txt
|-- dir3
|   `-- file.txt
`-- test
    `-- script.pl

代码1:

my $link = dirname($ARGV[0]).'/'.readlink($ARGV[0]); 
print rel2abs($link), "\n";

命令:./script.pl ../dir1/link1

结果:/tmp/perl_script_test/test/../dir1/../dir2/link2

预期的:/tmp/perl_script_test/dir2/link2

我正在寻找符号链接直接目标的绝对路径../

我试过了abs_path()realpath()但他们都给出了最终目标的路径(file.txt

是否有任何内置函数可以做我想做的事情,我需要拆分路径并进行手动连接?

--

莫汉G

4

1 回答 1

1

File::Pathabsolute不做任何文件系统检查。

use File::Path qw( file );

my $link_qfn = file(...);

my $link_dir_qfn = $link_qfn->dir;
my $target_qfn   = $link_dir_qfn->file(readlink($link_qfn));
my $target_fqfn  = $target_qfn->absolute;

say $target_fqfn;

说 CWD 是/tmp/perl_script_test/test

$link_qfn     ../dir1/link1
$link_dir_qfn ../dir1
$target_qfn   ../dir1/../dir2/link2
$target_fqfn  /tmp/perl_script_test/test/../dir1/../dir2/link2

说 CWD 是/tmp/perl_script_test

$link_qfn     dir1/link1
$link_dir_qfn dir1
$target_qfn   dir1/../dir2/link2
$target_fqfn  /tmp/perl_script_test/dir1/../dir2/link2

您已将以下内容添加到您的问题中:

我正在寻找没有 ../ 的符号链接直接目标的绝对路径

如果没有可能解决符号链接,您将无法安全地做到这一点。例如,

/tmp/perl_script_test/dir1/../dir2/link2

不一定等同于

/tmp/perl_script_test/dir2/link2

因为

/tmp/perl_script_test/dir1 

可能是符号链接。


以下内容对您来说可能就足够了:

use Cwd        qw( real_path );
use File::Path qw( dir file );

my $link_qfn = file(...);

my $link_dir_qfn    = $link_qfn->dir;
my $target_qfn      = $link_dir_qfn->file(readlink($link_qfn));
my $target_fn       = $target_qfn->basename;
my $target_dir_qfn  = $target_qfn->dir;
my $target_dir_fqfn = dir(real_path($target_dir_qfn));
my $target_fqfn     = $target_dir_fqfn->file($target_fn);

say $target_fqfn;

说 CWD 是/tmp/perl_script_test/test

$link_qfn        ../dir1/link1
$link_dir_qfn    ../dir1
$target_qfn      ../dir1/../dir2/link2
$target_fn       link2
$target_dir_qfn  ../dir1/../dir2
$target_dir_fqfn /tmp/perl_script_test/dir2
$target_fqfn     /tmp/perl_script_test/dir2/link2

如果以下都不是符号链接,您将仅获得上述输出:

/tmp
/tmp/perl_script_test
/tmp/perl_script_test/test
/tmp/perl_script_test/dir1
/tmp/perl_script_test/dir2

(即使前两个是符号链接,你也可以让它工作,但这需要更多的工作。)

于 2019-04-30T01:31:34.690 回答