国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
トップ 一覧 検索 ヘルプ RSS ログイン

Perl-Findで、ディレクトリ以下のすべてのファイルを自動的に選択

最近は、Pythonに心を奪われ、Perl信者ではなくなってきているが、
以下に示すテクニックは、pythonだと長くなるようで、perlに軍配が上がると思っています。
非常に実用的です。
loop.pl(199)

$dir 以降のすべてのファイルを見つけ出す。

#! /usr/bin/perl

use strict;
use warnings;
use File::Find;
use File::Path;
sub print_file{
   my $target = $File::Find::name;
   my $dir = $File::Find::dir;
   our @list;
   if(-f "$target"){
      push(@list,$target);
   }
}
&main();
exit(1);
sub main{
   my $dir = $ARGV[0];
   my $target = $ARGV[1];
   our @list;
   find(\&print_file,$dir);
   my $file;
   foreach $file (@list){
      if($file =~ /$target/){
         print "$file \n";
         system("python make_netcdf.py $file");
      }
   }
}

このperlプログラムのprint_fileのサブルーチンは基本的に変える必要はなく、
mainの中で、dir を指定し、そのディレクトリ以下のすべてのファイルで、
targetにマッチするファイルについて、systemで囲まれたコマンドを実施する。という内容となっています。

ここで注意は、print_file のサブルーチンは、ファイルのみに反応し、ディレクトリには反応しないようになっています。
ただし、dirに、相対PATHを指定すると、失敗します。必ず、dirには絶対PATHを指定してください。