我需要搜索以特定模式开头的目录中的文件,比如说“abc”。我还需要消除结果中以“.xh”结尾的所有文件。我不知道如何在Perl中做到这一点。
我有这样的事情:
opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK
我还需要删除以“.xh”结尾的结果中的所有文件
谢谢,毕
答案 0 :(得分:7)
试
@files = grep {!/\.xh$/} <$MYDIR/abc*>;
其中MYDIR是一个包含目录路径的字符串。
答案 1 :(得分:7)
opendir(MYDIR,$ newpath);我的@files = grep(/ abc *。* /,readdir(MYDIR)); #DOES NOT WORK
你正在混淆一个带有glob模式的正则表达式模式。
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dir_h, '.'
or die "Cannot open directory: $!";
my @files = grep { /abc/ and not /\.xh$/ } readdir $dir_h;
closedir $dir_h;
print "$_\n" for @files;
答案 2 :(得分:3)
opendir(MYDIR, $newpath) or die "$!";
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR);
close MYDIR;
foreach (@files) {
do something
}
答案 3 :(得分:2)
kevinadc和Sinan Unur使用但未提及的一点是readdir()
在列表上下文中调用时返回目录中所有条目的列表。然后,您可以使用任何列表运算符。这就是你可以使用的原因:
my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR;
所以:
readdir MYDIR
返回MYDIR中所有文件的列表。
和
grep (/abc/ && !/\.xh$/)
返回符合条件的readdir MYDIR
返回的所有元素。
答案 4 :(得分:-1)
foreach $file (@files)
{
my $fileN = $1 if $file =~ /([^\/]+)$/;
if ($fileN =~ /\.xh$/)
{
unlink $file;
next;
}
if ($fileN =~ /^abc/)
{
open(FILE, "<$file");
while(<FILE>)
{
# read through file.
}
}
}
此外,可以通过执行以下操作来访问目录中的所有文件:
$DIR = "/somedir/somepath";
foreach $file (<$DIR/*>)
{
# apply file checks here like above.
}
或者,您可以使用perl模块File :: find。
答案 5 :(得分:-1)
而不是使用opendir
并过滤readdir
(不要忘记closedir
!),而是使用glob
:
use File::Spec::Functions qw(catfile splitpath);
my @files =
grep !/^\.xh$/, # filter out names ending in ".xh"
map +(splitpath $_)[-1], # filename only
glob # perform shell-like glob expansion
catfile $newpath, 'abc*'; # "$newpath/abc*" (or \ or :, depending on OS)