globで再帰的にファイルパスを得る

最近、ブログを更新せずに何をしてたかというと、
青色申告的なアレですね。
そのために、Perl書いてました。

ただ、集計関係のスクリプトはアレというか、
去年あたりに記事を書いたので、今日は違う内容を。

たまたま、あるフォルダ以下のファイルの中身を走査する必要があって、
その時に書き捨てスクリプトを書いたんだけど、
良い機会なのでglobを使って書いてみた。

こんな感じのフォルダ階層があったとして。

$ tree .
.
├── aaa.pl
└── bar
    ├── aaa.txt
    ├── bbb.pl
    ├── ccc.cgi
    └── foo
        ├── aa.txt
        ├── bb.pl
        ├── cc.cgi
        └── hoge
            ├── a.txt
            ├── b.pl
            └── c.cgi

“aaa.pl”は、もちろんスクリプトファイルですね。

use v5.14;
use strict;
use warnings;

my @files = get_cgi_files( './*' );
say $_ for @files;

sub get_cgi_files {
    my $path = shift;

    say "Search: $path";

    my @ret = ();
    foreach ( glob "\"$path\"" ) {
        if ( /\.cgi$/ ) {
            push @ret, $_;
        }
        elsif ( -d $_ ) {
            push @ret, get_cgi_files( $_ . '/*' );
        }
    }

    return @ret;
}

実行すると、こんな感じ。
$ perl aaa.pl
Search: ./*
Search: ./bar/*
Search: ./bar/foo/*
Search: ./bar/foo/hoge/*
./bar/ccc.cgi
./bar/foo/cc.cgi
./bar/foo/hoge/c.cgi

globの引数をダブルクォーテーションで括ってるのは、
半角スペースを含むファイルとかディレクトリを考慮してです。
ファイルパスの区切りがスラッシュだけど、
これ自体は、Win環境で書いて実行させてました。

という訳で、今週の水曜日はHokkaido.pm Casualですね!

おしまい。

Leave a Comment