2009-10-02 54 views
9

Tôi đang sử dụng mã này để có được một danh sách tất cả các tập tin trong một thư mục cụ thể:Làm cách nào để có danh sách tất cả các tệp có phần mở rộng nhất định từ một thư mục cụ thể?

opendir DIR, $dir or die "cannot open dir $dir: $!"; 
my @files= readdir DIR; 
closedir DIR; 

Làm thế nào tôi có thể sửa đổi mã này hoặc thêm một cái gì đó với nó để nó chỉ trông cho các tập tin văn bản và chỉ tải mảng với tiền tố của tên tập tin?

nội dung thư mục Ví dụ:

. 
.. 
923847.txt 
98398523.txt 
198.txt 
deisi.jpg 
oisoifs.gif 
lksdjl.exe 

Ví dụ nội dung mảng:

files[0]=923847 
files[1]=98398523 
files[2]=198 
+0

Cũng xem xét sử dụng biến từ vựng cho xử lý thư mục của bạn: 'opendir my $ dirh, $ dir_path hoặc die" không thể mở dir $ dir: $! ";' –

Trả lời

10
my @files = glob "$dir/*.txt"; 
for (0..$#files){ 
    $files[$_] =~ s/\.txt$//; 
} 
+0

bất kỳ ý tưởng nào về cách regex thư mục? đầu ra của tôi là/dir/dir/dir/923847 ... làm thế nào tôi có thể nhận được 923847? – CheeseConQueso

+0

glob bổ sung thêm công việc tại đây. Xem http://stackoverflow.com/questions/1506801/what-reasons-are-there-to-prefer-glob-over-readdir-or-vice-versa-in-perl –

5

nó là đủ để thay đổi một dòng:

my @files= map{s/\.[^.]+$//;$_}grep {/\.txt$/} readdir DIR; 
2

Để có được chỉ là". txt "tập tin, bạn có thể sử dụng một hoạt động thử nghiệm tập tin ator (-f: tập tin thông thường) và một regex.

my @files = grep { -f && /\.txt$/ } readdir $dir; 

Nếu không, bạn có thể tìm kiếm tập tin văn bản chỉ, sử dụng (khai thác ascii-văn bản kiểm tra tập tin) -T perl của

my @files = grep { -T } readdir $dir; 
+0

-T là để kiểm tra xem bạn có "textfile" – reinierpost

+0

Điểm tốt; từ trang perldoc trên toán tử (http://perldoc.perl.org/5.8.8/perlfunc.html), "-T \t Tệp là một tệp văn bản ASCII (phỏng đoán heuristic)." nếu anh ta tìm kiếm các tập tin ".txt", điều này sẽ làm chính xác những gì anh ta hỏi mà không đoán. –

3

Nếu bạn có thể sử dụng tính năng mới của Perl 5.10, đây là cách Tôi sẽ viết nó.

use strict; 
use warnings; 
use 5.10.1; 
use autodie; # don't need to check the output of opendir now 

my $dir = "."; 

{ 
    opendir my($dirhandle), $dir; 
    for(readdir $dirhandle){ # sets $_ 
    when(-d $_){ next } # skip directories 
    when(/^[.]/){ next } # skip dot-files 

    when(/(.+)[.]txt$/){ say "text file: ", $1 } 
    default{ 
     say "other file: ", $_; 
    } 
    } 
    # $dirhandle is automatically closed here 
} 

Hoặc nếu bạn có thư mục rất lớn, bạn có thể sử dụng vòng lặp while.

{ 
    opendir my($dirhandle), $dir; 
    while(my $elem = readdir $dirhandle){ 
    given($elem){ # sets $_ 
     when(-d $_){ next } # skip directories 
     when(/^[.]/){ next } # skip dot-files 

     when(/(.+)[.]txt$/){ say "text file: ", $1 } 
     default{ 
     say "other file: ", $_; 
     } 
    } 
    } 
} 
1

Chỉ cần sử dụng này:

my @files = map {-f && s{\.txt\z}{} ? $_ :()} readdir DIR; 
1

Đây là cách đơn giản nhất tôi đã tìm thấy (như trong con người có thể đọc được) bằng cách sử dụng chức năng glob:

# Store only TXT-files in the @files array using glob 
my @files = grep (-f ,<*.txt>); 
# Write them out 
foreach $file (@files) { 
    print "$file\n"; 
} 

Ngoài ra các "-f "đảm bảo rằng chỉ các tệp thực tế (và không phải thư mục) được lưu trữ trong mảng.

+0

Tại sao quay lại chỉnh sửa? 'foreach $ file' không an toàn nghiêm ngặt. Nếu bạn thích 'foreach' đến' for', tại sao không 'foreach $ file' của tôi? –

+0

Tại sao chỉnh sửa ai đó elses công cụ cũ khi bạn không biết lý do tại sao nó được đăng ở nơi đầu tiên? Tôi thậm chí không biết lý do tại sao tôi đã viết đoạn mã này hơn ba năm trước, nhưng vì tôi có thói quen kiểm tra, nó có thể hoạt động tốt, và có lẽ lý do tôi không thêm vào khai báo. Tuy nhiên điều đó có nghĩa là tôi chỉ nên chấp nhận một chỉnh sửa ngẫu nhiên, và tôi thậm chí muốn dành thời gian thử nghiệm nó? Trơi ơi không!Đó là lý do tại sao tôi thấy nó an toàn hơn nhiều khi chỉ cuộn lại. – Kebman

+0

Chỉ cần rõ ràng, không phải tôi đã chỉnh sửa nó, tôi vừa thấy bản chỉnh sửa và nghĩ rằng nó đã cải thiện câu trả lời. Thật kỳ lạ khi bạn sử dụng '@ files' từ vựng và sau đó là' $ file' toàn cục. –

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