[Perl]ディレクトリを再帰的にたどりファイル一覧を取得したい その1
以下のエントリーの続き。
[Linux]ディレクトリを再帰的にたどりファイル一覧を取得したい
http://katsubemakito.net/cgiperl/2006/10/_perl_1.html
特定のディレクトリ配下を再帰的にたどりファイル一覧を表示などしたい。階層の深さが決まっていればかんたんに取得できる方法もあるが、階層はまちまちで、今後もダイナミックに変化していく。このような場合にはどうすれば良いだろうか。
今回はPerlでの実装方法について解説する。
○オリジナルの関数を用意する
再帰については見てもらった通り、関数(サブルーチン内)で自分自身を呼び出せばOKだ。
;#
;#再帰表示
;#
use strict;
#-- 再帰実行 --#
reflexiveFile('.');
#-------------------------------------------#
#■ディレクトリ配下を全て表示
#-------------------------------------------#
sub reflexiveFile{
my $dir = shift;
my @list = ();
#-- カレントの一覧を取得 --#
opendir(DIR, $dir) or die("Can not open directory:$dir ($!)");
@list = readdir(DIR);
closedir(DIR);
foreach my $file (sort @list){
next if( $file =~ /^\.{1,2}$/ ); # '.' と '..' はスキップ
#-- ディレクトリの場合は自分自身を呼び出す --#
if( -d "$dir/$file" ){
reflexiveFile("$dir/$file");
}
#-- それ以外は表示 --#
else{
print "$dir/$file\n";
}
}
}
○実行結果
./define.pm
./index.cgi
./js/index.js
./note/add.cgi
./note/del.cgi
./note/index.cgi
./note/view.cgi
ここではファイル名の表示を行っているが、もちろん他の処理へ置き換えることが可能だ。変数に格納、関数(サブルーチン)を呼び出す、ファイル操作(削除・リネームなど)など様々な用途に利用できる。
注意する点としては、ディレクトリ内の一覧を取得する時に、配列に全てを格納しておくことである。これを行わずに、ディレクトリ一覧を読み込みながら処理を行うと期待通りに動作しない場合がある。
○関連
[Linux]ディレクトリを再帰的にたどりファイル一覧を取得したい
http://katsubemakito.net/cgiperl/2006/10/_perl_1.html
[Perl]ディレクトリを再帰的にたどりファイル一覧を取得したい その2
http://katsubemakito.net/cgiperl/2006/10/perl2.html

