S3バケットから正規表現にマッチするファイル一覧を取得
S3バケット内のファイルを、正規表現にマッチしたものだけ取り出したいのですが、以前のSDKにはあったメソッドが、現在のv2にはなかったので、それっぽいものを作ってみました。
v2 に map_string( $pcre )
次のコマンドで、イテレーターオブジェクトを取得。
その後、ファイル名だけを配列として取り出して、map_string()で変換。という流れで作ってみてます。
<?php // 関数 map_string (SDK v1を少し改造版) function map_string($ilist, $pcre = null) { $list = array_map('strval', $ilist); $dlist = array(); if ($pcre) { foreach ($list as $item) { $dlist[] = preg_match($pcre, $item) ? $item : null; } $list = array_values(array_filter($dlist)); } return $list; } // s3クライアント $iterator = $s3->getIterator('ListObjects', array( 'Bucket' => 'backet-name' )); // 取得したイテレーター内のファイル名一覧を作成した関数にかける $dlist = array(); $nlist = array(); $pattern = '/*.txt/' foreach ($iterator as $object) { echo $object['Key'] . "\n"; $dlist[] = $object['Key']; } $nlist = map_string($dlist, $pattern); ?>
AWS SDK for PHP 1 の場合
get_object_list () メソッドのオプションとして正規表現を設定できます。
SDK内部で preg_match() を使ってフィルタが実装されていました。
- get_object_list ( $bucket, $opt )
- $opt に pcre:A Perl-Compatible Regular Expression (PCRE) が設定できる仕様
- list_objects ( $bucket, $opt )
- 前出の get_object_list() を読むと、list_objects() の結果に対して、次の map_string() をかけてます
- map_string ( $pcre )
- このメソッドで、引数があれば正規表現にマッチしたものだけを返す仕様
その他
v2 でも UploadSyncGuilderクラスには、uploadFromGlobメソッドがありglob()と同じようにアップロード対象が絞り込めます。こちらは、PHP5.3から提供されているイテレータークラスを使って実装されていました。
もしかするとこちらの方向でも、実装できるのかもしれませんが理解が足りなかったので、今回は前述の方法で解決することにしました。
イテレータークラスについては、次のサイトが詳しくわかりやすかったです。
- idocsq.net 追加されたイテレータクラス - GlobIterator
あと余談ですが、今回 AWS SDK のソースを追いかけてみて、オープンソースの恩恵を受けてるなぁと感じました。ここまで追いかけることってこれまでなかったので。感謝。
(ところで、うまくHatenaBlogのPHPシンタックスハイライトされない。。。JavaScriptとしてみたら少々ましになった)