find コマンドの模倣

作成日:2009-01-07
最終更新日:

Unix には find コマンドがある。特定のディレクトリを指定し、 その下のファイルやサブディレクトリに対して再帰的な処理を行うためのコマンドである。 私のような Unix 初心者には使いこなすのが難しかったが、 いかにも Unix 的な香りがするコマンドである。

Windows で同じような処理を行うにはどうすればよいか。 一つは Cygwin を入れてしまう、ということがある。 別の考えとして、Perl や Ruby で同じことをプログラミングする、 ということがある。 今回は、Perl で同じようなことをするためのプログラミングについて、 少し述べる。

今回やりたいのは、特定のディレクトリ以下、ファイルをフルパスで表示する、 というものである。 下のサンプルを見ておわかりの通り、 File::Find モジュールを用いれば素直に書ける。

# find コマンドを模倣する
# 参考 Perl モジュール活用ガイド p.91-92

use File::Find;
use Config;

find( \&check_file, @ARGV);

sub check_file {
  $fullpath = "$File::Find::name";
  if ( -f $fullpath ) {
    print "$fullpath\n";
  }
}

コマンド

perl filefind.pl c:\windows

実行結果

c:\windows/0.log
c:\windows/002555_.tmp
c:\windows/ALCMTR.EXE
c:\windows/ALCWZRD.EXE
c:\windows/bootstat.dat
(以下省略)

この check_file サブルーチンを改造することで、 さまざまなファイルやディレクトリを探し、 表示することができる。このサブルーチンを呼ぶ前に、 find ルーチンが行う処理は以下の通り。

ちなみに、同等のことをするUNIXの find コマンドの書き方は、 次の通り。c:\windows 配下のファイルをすべて表示するコマンドである。

% find c:\windows -type d -print

まりんきょ学問所Perl 手習い > find コマンドの模倣


MARUYAMA Satosi