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