2010-02-08 136 views
1

我需要检查目录中是否存在文件。文件名有类似的模式:perl中与-e和正则表达式匹配的文件名

/d1/d2/d3/abcd_12345_67890.dat

在我的计划,我会知道文件名多达abcd_

我需要编写使用-e选项的if条件,找到匹配上面给出的图案文件。

+2

你有一点的XY问题在这里:http://www.perlmonks.org/index.pl?node_id=542341。解释使用你需要完成的事情,而不是你认为你必须这样做。你为什么需要用-e写一个if条件?你是否认为你需要这样做?如果你只知道部分文件名,你怎么知道你想要的文件名?最后需要回答什么? – 2010-02-08 21:05:58

回答

11

您可以使用glob返回其名称的现有文件列表的匹配模式:

my @files = glob '/d1/d2/d3/abcd_*.dat'; 

在这种情况下,就没有必要进行-e filetest。

2

如果我正确理解你的问题,你想检查文件是否存在,并且文件名具有特定的格式。如果这是你想要的,你可以这样做:

use File::Basename; 

$file = "/d1/d2/d3/abcd_12345_67890.dat"; 

print "SUCCESS" if(-e $file and (basename($file)=~m{^abcd_})) 
+0

根据现在的问题(由您编辑?),Venkat不知道整个文件名,只是前5个字符。这似乎并没有解决他的问题。 – jimtut 2010-02-08 17:18:04

3

不能为部分文件名匹配使用-e

use File::Basename; 
use File::Slurp; 

my ($name, $path) = basename('/d1/d2/d3/abcd_'); 
my $exists = grep { /^\Q$name\E_[0-9]{5}_[0-9]{5}\.dat\z/ } read_dir $path; 

如果目录包含了很多文件,你仍然可以保持你的程序的足迹,通过使用opendir和while循环使用readdir不变。

我在这里用File::Slurp::read_dir来呈现一个整洁的解决方案。

0

如何

foreach $f (</d1/d2/d3/*.dat>) {if ($f =~ /\w{4}_\d{5}_\d{5}\.dat/) {print $f}}; 
+3

带*的尖括号只是glob的语法糖。明确的做法更清洁。 – jmanning2k 2010-02-08 16:07:02