Tôi hơi bối rối từ tài liệu File::Find
... Tương đương với số $ find my_dir -maxdepth 2 -name "*.txt"
là gì?Làm cách nào để sử dụng Tệp :: Tìm trong Perl?
Trả lời
Cá nhân, tôi thích File::Find::Rule
vì điều này không cần bạn tạo thói quen gọi lại.
use strict;
use Data::Dumper;
use File::Find::Rule;
my $dir = shift;
my $level = shift // 2;
my @files = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->in($dir);
print Dumper(\@files);
Hoặc cách khác tạo ra một iterator:
my $ffr_obj = File::Find::Rule->file()
->name("*.txt")
->maxdepth($level)
->start($dir);
while (my $file = $ffr_obj->match())
{
print "$file\n"
}
+1 Tôi nghĩ đây là giải pháp đơn giản nhất,' $ find' giống như được đề xuất. –
không may với trình vòng lặp, nó lấy tất cả cấu trúc thư mục vào bộ nhớ. khi cấu trúc quá lớn (điển hình), thì quá trình sẽ tiêu tốn rất nhiều bộ nhớ. Đó là lý do tại sao độ phân giải này thường không tốt. Ngược lại, cây dir scannind bằng lệnh tìm hệ thống cung cấp tùy chọn tìm nạp trực tuyến mà không tốn nhiều RAM. – Znik
Tôi nghĩ rằng tôi chỉ muốn sử dụng một glob
kể từ khi bạn thực sự không cần tất cả những thứ thư mục traversal:
my @files = glob('*.txt */*.txt');
tôi đã File::Find::Closures để làm cho nó dễ dàng cho bạn để tạo ra các callbacks mà bạn vượt qua find
:
use File::Find::Closures qw(find_by_regex);
use File::Find qw(find);
my($wanted, $reporter) = File::Find::Closures::find_by_regex(qr/\.txt\z/);
find($wanted, @dirs);
my @files = $reporter->();
Thông thường, bạn có thể biến một find (1) lệnh vào một chương trình Perl với find2perl
(loại bỏ trong v5.20 nhưng trên CPAN):
% find2perl my_dir -d 2 -name "*.txt"
Nhưng dường như find2perl
không hiểu -maxdepth
, vì vậy bạn có thể rời khỏi rằng off:
% find2perl my_dir -name "*.txt"
#! /usr/local/perls/perl-5.13.5/bin/perl5.13.5 -w
eval 'exec /usr/local/perls/perl-5.13.5/bin/perl5.13.5 -S $0 ${1+"[email protected]"}'
if 0; #$running_under_some_shell
use strict;
use File::Find();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, 'my_dir');
exit;
sub wanted {
/^.*\.txt\z/s
&& print("$name\n");
}
Bây giờ bạn đã các lập trình bắt đầu, bạn có thể cắm vào bất cứ điều gì khác mà bạn cần, bao gồm một bước preprocess
để tỉa cây.
+1 Cảm ơn! tốt để tìm hiểu về 'File :: Find :: Closures' –
use File::Find ;
use Cwd ;
my $currentWorkingDir = getcwd;
my @filesToRun =();
my $filePattern = '*.cmd' ;
#add only files of type filePattern recursively from the $currentWorkingDir
find(sub { push @filesToRun, $File::Find::name
if (m/^(.*)$filePattern$/) }, $currentWorkingDir) ;
foreach my $file (@filesToRun )
{
print "$file\n" ;
}
Cảm ơn - đây chỉ là những gì tôi đang tìm kiếm. – Winter
Ngoài ra còn có các tiện ích find2perl. Sử dụng nó thay vì lệnh Unix find, với các đối số dòng lệnh giống như 'find', và nó sẽ tạo ra mã Perl tương ứng sử dụng File :: Find.
$ find2perl my_dir -maxdepth 2 -name "*.txt"
- 1. Làm cách nào để tìm tệp Perl nào được tải khi tôi sử dụng mô-đun?
- 2. Làm cách nào để chương trình Perl biết nơi tìm tệp chứa mô-đun Perl mà nó sử dụng?
- 3. Làm cách nào để tìm ra tên tệp của tệp được yêu cầu trong Perl?
- 4. Làm cách nào để phân biệt hai tệp trong Perl?
- 5. Làm cách nào để xóa một tệp trong Perl?
- 6. Làm cách nào để chuyển một tham số đến hàm mong muốn khi sử dụng Tệp của Perl :: Tìm?
- 7. Làm cách nào để tìm các ký tự ASCII mở rộng trong một tệp bằng Perl?
- 8. Làm cách nào để sử dụng GTK3 với perl?
- 9. Làm thế nào để tìm kiếm các dòng trong một tệp giữa hai dấu thời gian sử dụng Perl?
- 10. Làm cách nào để tôi sử dụng thuộc tính/biến của lớp làm tệp có tay in trong Perl?
- 11. Làm cách nào để mở một tệp Unicode bằng Perl?
- 12. Tôi làm cách nào để tìm ra tên tệp của gói Perl?
- 13. Tôi làm cách nào để tìm ra tệp maven settings.xml nào đang sử dụng
- 14. Làm thế nào để bạn sử dụng sed từ Perl?
- 15. Tôi làm cách nào để sử dụng s /// của Perl trong một biểu thức?
- 16. Trong Perl, làm cách nào để tìm hiểu xem tệp của tôi có đang được sử dụng làm mô-đun hay chạy dưới dạng tập lệnh không?
- 17. Làm thế nào để sử dụng đúng cách try catch trong perl mà error.pm cung cấp?
- 18. Làm cách nào để tìm thư mục chính của người dùng trong Perl?
- 19. Làm cách nào để biết loại tệp sử dụng Boost.Filesystem?
- 20. Làm cách nào để sử dụng không gian tên xml với tìm/tìm thấy trong lxml?
- 21. Java - Làm cách nào để sử dụng tệp lớp?
- 22. Tôi nên sử dụng Tệp Perl :: Temp như thế nào?
- 23. Làm cách nào để chuyển hướng đầu ra tiêu chuẩn sang một tệp trong Perl?
- 24. Tôi làm cách nào để tìm các dòng trong một tệp nhưng không tìm thấy dòng khác bằng cách sử dụng tập lệnh bash?
- 25. Trong Perl, làm cách nào để đặt nhiều gói trong một tệp .pm?
- 26. Tôi làm cách nào để Apache xử lý các tệp .pl (Perl) bằng cách sử dụng mod_perl?
- 27. Làm cách nào để sử dụng cú pháp bash trong hệ thống của Perl()?
- 28. Làm cách nào để lọc một mảng mà không sử dụng vòng lặp trong Perl?
- 29. Làm cách nào để sử dụng lập trình không đồng bộ trong Perl?
- 30. Tôi làm cách nào để có được số lượng trang trong một tệp PDF trong Perl?
'my @files = \' tìm $ my_dir -maxdepth 2 -name * .txt \ ';' ... Tôi không nhận được phần phụ 'Wanted'. Tôi không thể chỉ cho một regex? –
Một câu hỏi khác về [Tìm tệp bằng Perl] (http://stackoverflow.com/questions/17754931/finding-files-with-perl) đề cập đến một số lựa chọn thay thế không được đề cập trong các câu trả lời bên dưới. –