2009-06-11 10 views
7

Potrzebuję wyszukać pliki w katalogu, który zaczyna się od określonego wzorca, powiedz "abc". Też muszę wyeliminować wszystkie pliki w wyniku, który kończy się na ".xh". Nie jestem pewien, jak to zrobić w Perlu.Filtruj nazwy plików według wzorca

mam coś takiego:

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

również trzeba wyeliminować wszystkie pliki z wyniku, które kończą się ".xh"

Dzięki, Bi

Odpowiedz

7

spróbować

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

gdzie mydir to ciąg zawierający ścieżkę katalogu.

+0

Musisz zakotwiczyć to wyrażenie na końcu łańcucha i uciec. jakoś (lubię używać klasy postaci). Ponieważ to twoje wyrażenie dopasuje "abcxh.txt". Zamiast tego spróbuj /[.]xh$/. –

+0

Dzięki - działało! –

+0

Dziwne, miałem wiele problemów z prawidłowym sformatowaniem tej odpowiedzi - udało mi się uciec z tego okresu, ale to się nie pokazuje (chyba że ucieknę przed ucieczką). Również <i> były zmaganiem! Dzięki za złapanie kotwicy $, nie testowałem dla tej sprawy. Naprawiono. –

-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. 
      } 
    } 
} 

również wszystkie pliki w katalogu można uzyskać, wykonując:

$DIR = "/somedir/somepath"; 
foreach $file (<$DIR/*>) 
{ 
    # apply file checks here like above. 
} 

Alternatywnie można użyć modułu perl Plik :: znajdź.

7

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

Dezorientujesz wzór regex ze wzorem globu.

#!/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; 
3
opendir(MYDIR, $newpath) or die "$!"; 
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR); 
close MYDIR; 
foreach (@files) { 
    do something 
} 
2

Punktem że kevinadc i Sinan Unur używasz ale nie wspomnieć, że readdir() zwraca listę wszystkich wpisów w katalogu, gdy wywołana w kontekście listowym. Możesz wtedy użyć dowolnego operatora listy. Dlatego można użyć:

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

Więc:

readdir MYDIR 

zwraca listę wszystkich plików w mydir.

I:

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

zwraca wszystkie elementy zwrócone przez readdir MYDIR spełniające kryteria tam.

+0

Zmodyfikuj tę drugą kontrolę, aby była /\.xh$/, a będziesz sprawdzać, co trzeba. :) –

-1

Zamiast opendir i filtrowanie readdir (nie zapomnij closedir!), Można zamiast tego użyć 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) 

Jeśli nie dbają o wyeliminowanie $newpath ustalonej z wynikami glob , pozbyć się map+splitpath.

+0

Nie ma potrzeby, aby mapa lub splitpath. Albo kończy się na .xh, albo nie. Ta dodatkowa praca tego nie zmienia. –

+0

Huh? glob ("./ abc *") zwraca ("./abc.txt", "./abc.xh"); jak inaczej spodziewasz się sprowadzić to do ("abc.txt")? – ephemient

Powiązane problemy