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