Фильтровать имена файлов по шаблону - PullRequest
7 голосов
/ 12 июня 2009

Мне нужно искать файлы в каталоге, которые начинаются с определенного шаблона, скажем «abc». Мне также нужно удалить все файлы в результате, которые заканчиваются на «.xh». Я не уверен, как это сделать в Perl.

У меня есть что-то вроде этого:

opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK

Мне также нужно удалить все файлы из результата, которые заканчиваются на ".xh"

Спасибо, Би

Ответы [ 6 ]

7 голосов
/ 12 июня 2009

opendir (MYDIR, $ newpath); my @files = grep (/ abc *. * /, readdir (MYDIR)); # НЕ РАБОТАЕТ

Вы путаете шаблон регулярного выражения с шаблоном глобуса.

#!/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;
7 голосов
/ 12 июня 2009

1001 * попробовать *

@files = grep {!/\.xh$/} <$MYDIR/abc*>;

где MYDIR - строка, содержащая путь к вашему каталогу.

3 голосов
/ 12 июня 2009
opendir(MYDIR, $newpath) or die "$!";
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR);
close MYDIR;
foreach (@files) { 
   do something
}
2 голосов
/ 12 июня 2009

Дело в том, что kevinadc и Sinan Unur используют, но не упоминают, что readdir() возвращает список всех записей в каталоге при вызове в контексте списка. После этого вы можете использовать любой оператор списка. Вот почему вы можете использовать:

my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR;

Итак:

readdir MYDIR

возвращает список всех файлов в MYDIR.

И

grep (/abc/ && !/\.xh$/)

возвращает все элементы, возвращаемые readdir MYDIR, которые соответствуют критериям там.

0 голосов
/ 12 июня 2009

Вместо использования 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)

Если вас не волнует исключение префикса $newpath с результатами glob, избавьтесь от map+splitpath.

0 голосов
/ 12 июня 2009
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.

...