2009-06-11 34 views
7

Tôi cần tìm kiếm tệp trong thư mục bắt đầu bằng mẫu cụ thể, nói "abc". Tôi cũng cần phải loại bỏ tất cả các tập tin trong kết quả mà kết thúc bằng ".xh". Tôi không chắc chắn làm thế nào để làm điều đó trong Perl.Lọc tên tệp theo mẫu

Tôi có một cái gì đó như thế này:

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

Tôi cũng cần phải loại bỏ tất cả các file từ kết quả kết thúc bằng ".xh"

Cảm ơn, Bi

Trả lời

7

thử

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

nơi MYDIR là một chuỗi chứa đường đi của thư mục của bạn.

+0

bạn cần phải neo regex đó ở cuối chuỗi và thoát khỏi. bằng cách nào đó (tôi thích sử dụng một lớp nhân vật). Vì regex của bạn sẽ khớp với "abcxh.txt". Thay vào đó hãy thử /[.]xh$/. –

+0

Cảm ơn - điều này đã hiệu quả! –

+0

Rất tiếc, tôi đã gặp rất nhiều vấn đề khi nhận được câu trả lời đúng định dạng - Tôi đã thoát khỏi khoảng thời gian, nhưng nó không hiển thị (trừ khi tôi trốn thoát). Ngoài ra, < và > là một cuộc đấu tranh! Cảm ơn bạn đã bắt được $ anchor, tôi đã không kiểm tra trường hợp đó. Đã sửa lỗi. –

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

cũng có, tất cả các tệp trong thư mục có thể được truy cập bằng cách thực hiện:

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

Bên ngoài bạn có thể sử dụng mô-đun perl File :: find.

7

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

Bạn đang bối rối một mẫu regex có hoa văn hình cầu.

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

Điểm rằng kevinadc và Sinan Unur đang sử dụng nhưng không nhắc đến là readdir() trả về một danh sách tất cả các mục trong thư mục khi gọi trong danh sách ngữ cảnh. Sau đó, bạn có thể sử dụng bất kỳ toán tử danh sách nào trên đó. Đó là lý do tại sao bạn có thể sử dụng:

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

Vì vậy:

readdir MYDIR 

trả về một danh sách tất cả các tập tin trong MYDIR.

Và:

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

trả về tất cả các yếu tố được trả về bởi readdir MYDIR phù hợp với tiêu chí đó.

+0

Sửa đổi lần kiểm tra thứ hai là /\.xh$/ và bạn sẽ kiểm tra điều đúng. :) –

-1

Thay vì sử dụng opendir và lọc readdir (đừng quên closedir!), Bạn có thể sử dụng thay vì 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) 

Nếu bạn không quan tâm đến loại bỏ sự $newpath tiền tố để kết quả của glob , hãy loại bỏ số map+splitpath.

+0

Không cần bản đồ hoặc đường nối. Hoặc là kết thúc bằng .xh hoặc không. Công việc phụ không thay đổi điều đó. –

+0

Huh? glob ("./ abc *") trả về ("./abc.txt", "./abc.xh"); làm thế nào khác bạn mong đợi để twiddle mà xuống đến ("abc.txt")? – ephemient

Các vấn đề liên quan