如何检查一个路径是否存在于 Perl 文件系统中的另一个路径下?

时间:2021-05-02 18:58:49

标签: perl

我有两条路。我想检查其中一个是否存在于文件系统中的另一个下。我会做类似的事情:

if (index($path,$subpath) != -1 && $path ne $subpath) {
    print("$subpath is subpath of $path\n");
}

但是将路径视为字符串结果存在一些问题。例如,如果 $path$subpath 是链接,它将不起作用。

检查 $subpath 下是否存在 $path 的可靠方法是什么?如果是链接,它应该检查链接(源文件而不是目标文件)本身是否存在于该路径下。

例如:

Path (realpath to dir): /a/b/c
Subpath (realpath to dir): /a/b/c/d

在这种情况下,第二个在第一个的文件系统下。另一个例子:

Path (realpath to dir): /a/b/c
Subpath: /p/x/y/z

例如,/p/x/y/z 是指向 /a/b/c/d/e/f 的链接。在这种情况下,它不在第一个路径的文件系统下,因为链接位于 /p/x/y/z 而不是 /a/b/c/... 下。希望有意义。

1 个答案:

答案 0 :(得分:3)

使用非常方便的 Path::Tiny 模块:

use Path::Tiny;

...

my $path = path("/a/b/c");
my $subpath = path("/a/b/c/d");
if ($path->subsumes($subpath)) {
    # True if $path is a prefix of $subpath
    ...
}

如果需要,您可以首先在一个(或两个)路径中使用 realpath 方法解析符号链接、.. 等:

my $path = path("/a/b/c")->realpath;
my $subpath = path("/p/x/y/z");
相关问题