2010-02-08 87 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