测试给定文件名是否在目录下的简单方法?

时间:2014-05-10 22:04:31

标签: perl filenames filepath subdirectory

是否有一个Perl模块(最好是核心),它有一个函数可以告诉我一个给定的文件名是否在目录内(或者是递归的目录的子目录)?

例如:

my $f = "/foo/bar/baz";

# prints 1
print is_inside_of($f, "/foo");

# prints 0
print is_inside_of($f, "/foo/asdf");

我可以编写自己的,但有一些复杂的因素,如符号链接,相对路径,是否可以检查文件系统等等。我宁愿不重新发明轮子。

2 个答案:

答案 0 :(得分:3)

Path::Tiny不是核心,但它没有非核心依赖,因此安装非常快捷。

use Path::Tiny qw(path);

path("/usr/bin")->subsumes("/usr/bin/perl");   # true

现在,它完全通过查看文件路径(在规范化它们之后)完成此操作,因此根据您在边缘情况(例如符号链接)中期望的行为,它可能或可能不够。但是对于大多数用途来说它应该足够了。 (如果要考虑硬链接,唯一的方法是搜索整个目录结构并比较inode编号。)

答案 1 :(得分:1)

如果您希望该功能仅适用于文件名(没有路径)和路径,则可以使用File::Find

#!/usr/bin/perl
use warnings;
use strict;

use File::Find;

sub is_inside_of {
    my ($file, $path) = @_;
    my $found;
    find( sub { $found = 1 if $_ eq $file }, $path);
    return $found
}

如果您不想检查文件系统,但只处理路径,请参阅File::Spec了解一些可以帮助您的功能。但是,如果要处理符号链接,则无法避免触及文件系统。