我可以在Perl中做这样的事情吗?意义模式匹配文件名并检查它是否存在。
if(-e "*.file")
{
#Do something
}
我知道要求系统列出存在的文件的更长的解决方案;将其作为文件读取,然后推断文件是否存在。
答案 0 :(得分:33)
您可以使用glob
返回与模式匹配的所有文件的数组:
@files = glob("*.file");
foreach (@files) {
# do something
}
如果您只想知道是否存在与模式匹配的文件,则可以跳过作业:
if (glob("*.file")) {
# At least one file matches "*.file"
}
答案 1 :(得分:0)
在* nix系统上,我使用了以下内容并获得了良好的效果。
sub filesExist { return scalar ( my @x = `ls -1a 2> /dev/null "$_[0]"` ) }
它回复了找到的匹配数,如果没有则回复0。使其易于用于'if'条件,如:
if( !filesExist( "/foo/var/not*there.log" ) &&
!filesExist( "/foo/var/*/*.log" ) &&
!filesExist( "/foo/?ar/notthereeither.log" ) )
{
print "No matches!\n";
} else {
print "Matches found!\n";
}
您可以使用的模式究竟是由您的shell支持的。但是大多数shell支持使用'*'和'?' - 他们在我看到的任何地方都意味着同样的事情。当然,如果你删除了对'标量'函数的调用,它将返回匹配 - 对于查找这些变量文件名很有用。
答案 2 :(得分:0)
在Windows上,我必须使用File::Glob::Windows,因为Windows路径中的反斜杠似乎无法正常工作。