我有两条路。我想检查其中一个是否存在于文件系统中的另一个下。我会做类似的事情:
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/...
下。希望有意义。
答案 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");