是否有一个Perl模块(最好是核心),它有一个函数可以告诉我一个给定的文件名是否在目录内(或者是递归的目录的子目录)?
例如:
my $f = "/foo/bar/baz";
# prints 1
print is_inside_of($f, "/foo");
# prints 0
print is_inside_of($f, "/foo/asdf");
我可以编写自己的,但有一些复杂的因素,如符号链接,相对路径,是否可以检查文件系统等等。我宁愿不重新发明轮子。
答案 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了解一些可以帮助您的功能。但是,如果要处理符号链接,则无法避免触及文件系统。