ディレクトリを再帰的にたどりファイル一覧を取得したい その1 - Perl

Perlでの実装方法について解説する。

サンプル

;#
;#再帰表示
;#

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";
    }
  }

}

実行結果

./css/view.css
./define.pm
./index.cgi
./js/index.js
./note/add.cgi
./note/del.cgi
./note/index.cgi
./note/view.cgi

ここではファイル名の表示を行っているが、もちろん他の処理へ置き換えることが可能だ。変数に格納、関数(サブルーチン)を呼び出す、ファイル操作(削除・リネームなど)など様々な用途に利用できる。

注意する点としては、ディレクトリ内の一覧を取得する時に、配列に全てを格納しておくことである。これを行わずに、ディレクトリ一覧を読み込みながら処理を行うと期待通りに動作しない場合がある。