2009-06-11 9 views
7

特定のパターン、たとえば "abc"で始まるディレクトリ内のファイルを検索する必要があります。私はまた結果で ".xh"で終わるすべてのファイルを削除する必要があります。私はPerlでそれをやり遂げる方法についてはわかりません。パターンによるファイル名のフィルタリング

私はこのようなものがあります:私もすべて、また "・XH" で終わる結果から、すべてのファイル

おかげで、バイ

答えて

7

はMYDIRは、ディレクトリのパスを含む文字列です

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

を試してみてください。

+0

文字列の最後にその正規表現を固定して、その正規表現をエスケープする必要があります。どういうわけか(私は文字クラスを使うのが好きです)。あなたの正規表現は "abcxh.txt"にマッチします。代わりに/[.]xh$/を試してください。 –

+0

ありがとう - これはうまくいった! –

+0

奇妙なことに、私はこの回答を正しくフォーマットすることに多くの問題を抱えていました。私は期間をエスケープしましたが、エスケープから脱出しない限り表示されません。また、<と>は闘争でした! $ anchorをキャッチしてくれてありがとう、私はそのケースについてはテストしなかった。 修正済み。 –

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

を排除する必要が

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

をディレクトリ内のファイルにアクセスするには、次のようにします。

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

代わりに、PerlモジュールFile :: findを使用することができます。

7

opendir(MYDIR、$ newpath);私の@files = grep(/ abc *。* /、readdir(MYDIR)); #DOES NOT WORK

グレッグパターンと正規表現パターンを混同しています。

#!/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

kevinadcとシナンUnurを使用しますが言及されていないという点は、リストコンテキストで呼び出されたときreaddir()は、ディレクトリ内のすべてのエントリのリストを返すということです。その上で任意のリスト演算子を使用できます。あなたが使用できる理由です:だから

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

readdir MYDIR 
MYDIR内のすべてのファイルのリストを返します

そして:

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

が条件に一致するreaddir MYDIRによって返されたすべての要素を返します。

+0

2番目のチェックを/\.xh$/に変更すると、正しいことがチェックされます。 :) –

-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) 

あなたがglobの結果に接頭辞$newpathを排除する気にしないのであれば、map+splitpathを取り除く。

+0

マップやスプリットパスは必要ありません。どちらかが.xhで終わるか、それとも終わらないか。余分な仕事はそれを変えない。 –

+0

ハァッ? glob( "./abc *")は( "./abc.txt"、 "./abc.xh")を返します。あなたはそれを( "abc.txt")まで動かすことを他にどのように期待していますか? – ephemient

関連する問題