RecursiveDirectoryIterator の使い方を完全に間違えてました。
環境によっては古い間違ったコードでも期待通りの動作をするんだけど、それはたぶんバグ。
--- gather.php.old +++ gather.php @@ -4,7 +4,7 @@ */ //define('AOZR_DIR', '/Volumes/青空文庫/作家別テキストファイル'); define('AOZR_DIR', dirname(__FILE__) . '/archives'); -define('AOZR_RE1', '^[\\x{3040}-\\x{309F}]+?・|(\\d+)$'); +define('AOZR_RE1', '^[\\w\\x{3040}-\\x{309F}]+?・|(\\d+)$'); define('AOZR_RE2','\\.txt$'); define('NFDKANA_RE', '/([うか-こさ-そた-とは-ほウカ-コサ-ソタ-トハ-ホゝヽ])\\x{3099}|([は-ほハ-ホ])\\x{309A}/u'); define('EST_DB', 'casket'); @@ -13,14 +13,14 @@ /** * ディレクトリを走査し、パス・著者・作品名をTSVで標準出力に書き出す */ -$dir = new RecursiveDirectoryIterator(AOZR_DIR); -foreach ($dir as $author) { - $name = $author->getFilename(); - if (!$author->isDot() && $author->isDir() && $author->hasChildren()) { +$flags = RecursiveDirectoryIterator::NEW_CURRENT_AND_KEY; +$dir1 = new RecursiveDirectoryIterator(AOZR_DIR, $flags); +foreach ($dir1 as $name => $author) { + if (!$dir1->isDot() && $dir1->isDir() && $dir1->hasChildren()) { $name = mb_ereg_replace(AOZR_RE1, '', NFD2NFC($name)); - foreach ($author->getChildren() as $work) { - $title = $work->getFilename(); - if (!$work->isDot() && $work->isFile() && $title != '.DS_Store') { + $dir2 = $dir1->getChildren(); + foreach ($dir2 as $title => $work) { + if (!$dir2->isDot() && $dir2->isFile() && $title != '.DS_Store') { $title = mb_ereg_replace(AOZR_RE2, '', NFD2NFC($title)); fwrite(STDOUT, sprintf("%s\t%s\t%s\n", $work->getPathname(), $name, $title)); }
02/03 追記:
fwrite(STDOUT, sprintf("%s\t%s\t%s\n", $work->getPathname(), $name, $title));
の代わりに
fprintf(STDOUT, "%s\t%s\t%s\n", $work->getPathname(), $name, $title);
という方法もあり、たぶんこっちのほうが効率が良い。
ちなみに STDOUT 定数は fopen('php://stdout', 'wb');
と等価のストリームリソース。