2009年6月18日

用 perl 列出指定目錄下的檔案及目錄

update on 2012/1/14

方法一:
Find::Find 是 perl 內含的模組,他可以列出指定目錄下的檔案及目錄
#!/usr/bin/perl -w

use strict;
use File::Find;

find( \&wanted, "/etc");
sub wanted() {
#列出目錄
print $File::Find::dir . "\n";

#列出檔案
print $_ . "\n";

#列出檔案的絕對路徑
print $File::Find::name . "\n";
}


利用匿名 hash 設定 File::Find 的參數
這邊特別提到 no_chdir 參數,讓 File::Find 不要切換工作目錄,如此 $_ 的內容等同 於$File::Find::name

#!/usr/bin/perl -w

use File::Find;
use strict;

#啟用 no_chdir 參數,各位可以比對一下確實與 $File::Find::name 內容相同
find( { wanted => \&wanted, no_chdir => 1}, "/etc" );
sub wanted() {
print $_ . "\n";
}
#利用匿名函式將找到的目錄存到陣列
#!/usr/bin/perl -w

use strict;
use File::Find;

my @FileList;
find( { wanted => sub { push(@FileList, $_) }, no_chdir => 1 }, "/etc" );



方法二:
File::Next是另一個遊走整個目錄樹以取得檔案或目錄列表的模組,可惜這個模組需要另外安裝,使用上比較不方便
http://search.cpan.org/dist/File-Next-1.02/Next.pm
#取得檔案列表
#!/usr/bin/perl -w

use strict;
use File::Next;

my $iter = File::Next::files( '/tmp' );

while ( defined ( my $file = $iter->() ) ) {
print $file, "\n";
}

執行後得到
/tmp/file1
/tmp/file2
/tmp/a/file1
..

※若要取得目錄只要將File::Next::files改為File::Next::dirs
※若要取得所有的檔案、目錄 or whatever 就改為File::Next::everything

#搜尋檔案(同linux下的find指令)
#紅字部份為過濾條件,也就是你想找的檔案名稱。下面的程式會找出gd.txt的路徑
my $iter = File::Next::files( {file_filter => sub { /gd\.txt$/ } }, 'D:\\' );
while ( defined ( my $files = $iter->() ) ) {
print $files, "\n";
}

沒有留言:

張貼留言