【问题标题】:How to check if one path exists under another path in the file system in Perl?Perl如何检查一个路径是否存在于文件系统中的另一个路径下?
【发布时间】:2021-05-02 18:58:49
【问题描述】:

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

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/... 下。希望有意义。

【问题讨论】:

  • 您能否提供一些示例路径和子路径(存在和不存在的)?
  • @Shawn 添加一些例子。希望现在更有意义。
  • 足够给出答案了,是的(我不确定你的子路径是像/a/b/c/d 这样的绝对路径还是像d 这样的相对路径)。
  • 您可以执行use Cwd; $path = Cwd::realpath( $path ); $subpath = Cwd::realpath( $subpath ); return( length( $subpath ) > length( $path ) && index( $subpath, $path ) == 0 );,它会告诉您$subpath 包含在$path 中。

标签: perl


【解决方案1】:

使用非常方便的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");

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 2011-12-26
    • 2018-09-16
    • 2023-03-17
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多