./testdir1 「特定ディレクトリ以下のファイル全てに対して処理を行うプログラム」を書く機会というのは、たまにありますね。, 「PHP ファイル 再帰的」といったワードで検索すると、色々引っかかります。それぞれ一長一短あります。「特定ディレクトリ以下のファイル全てに対して処理を行うプログラム」の様々な実装例を紹介します。, scandir()で指定ディレクトリ配下のファイル・ディレクトリの一覧を取得し、一覧にディレクトリが含まれていればさらに掘り進む、という仕組みです。, (1) $filesに .(カレントディレクトリへの参照) ..(親ディレクトリへの参照)が含まれていると、再帰を繰り返してMaximum function nesting levelに引っかかることがあるので、これらを除外, (2) $dirに’/’や’/var/’といった文字列が入っている場合に、$fullpathが’//usr’や’/var//www’とならないよう、rtrim() で$dirの最後尾の/を取り除いている, この方法でもできなくはありませんが、考慮する必要のある事柄が多く、大変です。この方法はおすすめしません。, 一見すると、1.と大差ないように見えますが、glob()はUnixシェルと同様のワイルドカードが使えます。「*.html」というパターンを指定して、.htmlという拡張子のファイルを取ってくる、といったことが簡単にできます。, PHP5には、Standard PHP Library (SPL) というライブラリが付属しています。このライブラリは、PHP5.0.0以降ではデフォルトで使用可能、PHP5.3.0以降では常に使用可能となっています。, RecursiveDirectoryIteratorは、ディレクトリを再帰的に反復処理するためのクラスです。, RecursiveDirectoryIteratorオブジェクトは、それ自体は再帰的な反復処理に対応していないため、RecursiveDirectoryIteratorオブジェクトを、さらにRecursiveIteratorIteratorオブジェクトに変換する必要があります。, なお、上記コード例では、他のコード例との一貫性のため最終的に配列を返していますが、配列にする必然性はありません。イテレータオブジェクトのままの方が使いやすい場面も多いでしょう。, 条件に合致したファイルだけをフィルタリングしたい場合、RecursiveFilterIteratorを継承したクラスを用意します。, RecursiveFilterIteratorを継承するクラスでは、accept()メソッドを実装する必要があります。accept()の中にフィルタリング条件を記述します(この場合、「ディレクトリである」又は「ファイル名の末尾が”.html”で終わる」)。, RecursiveDirectoryIteratorオブジェクトを、独自実装したHtmlFilterIteratorのコンストラクタに渡し、最後にHtmlFilterIteratorオブジェクトをRecursiveIteratorIteratorのコンストラクタに渡します。, RecursiveDirectoryIteratorを使った場合の利点は、ディレクトリの再帰的な走査を自分で書く必要がないことです。欠点は、各クラスの関係や、持っているメソッドの把握等が必要で、学習コストがかかることです。, 再帰的なディレクトリ操作をサポートしているライブラリもあります。決定版がどれかは分かりませんが、個人的に使ってみて良いと思ったのは、SymfonyコンポーネントのFinderです(Symfonyはフルスタックのフレームワークですが、コンポーネント単位でライブラリとして利用することもできます)。, Finderのインストール方法としては、(1) 公式のGitリポジトリからcloneする (2) Composerを使ってインストールする などがあります。, 以下のコード例は、Composerでインストールした場合です(Composerを使わない場合、オートローダを用意する必要があります。こちらの記事を参考にしてください)。, 再帰的なディレクトリ操作について意識する必要もなく、フィルターのためだけにクラスを作る必要もない、非常に使いやすいライブラリです。私なら、Symfonyコンポーネントを導入可能な環境では、迷わずこのライブラリを使いますね。, 単にファイルリストが欲しいだけなら、PHPでわざわざロジックを組まなくても、外部コマンドを呼び出せば済みます。, system()は、外部コマンドを実行し、その結果を表示します。findは、ファイル検索を行うUnixコマンドですね。, 外部コマンドの出力をPHPスクリプト内部で再利用したいなら、exec()やshell_exec()が使えます(exec()の方が、(1) コマンドからの出力を配列で取得できる (2) コマンド実行後のステータスコードを取得できる といった点で機能が豊富です)。, なお、外部コマンドの呼び出しは別プロセスの起動を伴うため、一般に高コストです。また、ユーザーの入力値をコマンドに反映する場合、セキュリティ的にも危険を伴います。, PHPにはファイル操作を行うための関数が揃っているので、基本的にはPHPの標準関数を使ったほうが良いでしょう。, PHPアプリケーションの一機能として実装する場合、1〜5のいずれかの方法になると思いますが、日常業務の中で「特定ディレクトリのファイルを一定ルールに従ってコピーしたい」といったニーズに対して、あえてPHPを使う必要はありません。, ファイルリストが欲しいだけなら、前述したfindコマンドなどを実行すれば十分です。, 込み入ったことをやる必要があるなら、PerlやRubyでスクリプトを組むのも良いでしょう。Perlの標準ライブラリに含まれるFile::Findは、とても使いやすいです。また、Rubyにも、File::Findとよく似たインターフェースのFind.findがあります。, 以下はRubyのFind.findの例です。SymfonyのFinderほど高機能ではありませんが、シンプルで使いやすいですね。, PHP5.0.0以降ではデフォルトで使用可能、PHP5.3.0以降では常に使用可能. phpアプリケーションの一機能として実装する場合、1〜5のいずれかの方法になると思いますが、日常業務の中で「特定ディレクトリのファイルを一定ルールに従ってコピーしたい」といったニーズに対して、あえてphpを使う必要はありません。 globモジュールとは 今回紹介したファイル操作の様々な場面で活用する事ができるので、是非使えるようにマスターしてください。また今回紹介したosモジュールには様々な便利な機能があるので、興味のある方はさらに学習を進めて理解を深めてください。   田島悠介 今回は、osモジュールを使用したディレクトリを作成する方法について紹介します。 相対パス・・・そのファイルから見たパス(場所) echo __DIR__; 指定したパスから配列の形式でファイル名やフォルダ名を取得可能です。 はい、触って覚えます♪   >> sample_files  「a」、「b」あるいは「c」のいずれかにマッチさせることが可能 また、自身で作ったモジュールなども読み込むことができます。 cdコマンドは、ディレクトリを移動するときに使用します。cd ディレクトリ名のように、cdの後ろにディレクトリ名を入力することで指定したディレクトリへ移動します。 PHPでMySQLを扱う方法について解説しています。 絶対パスとは、ルートディレクトリと呼ばれる階層構造の頂点から目的地までの経路を表しています。 挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。, Pythonでディレクトリを作成する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。 glob()関数で、特定のファイルを検索するには、第一引数の’検索したいパス’において「特殊文字」を使うとよいでしょう。 田島悠介 田島悠介 挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。, TechAcademyでは、初心者でも最短4週間で、PHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できる、, PHPで指定したディレクトリ内のファイル一覧を取得する方法を現役エンジニアが解説【初心者向け】, PHPのfilter_input関数の使用方法を現役エンジニアが解説【初心者向け】, PHPのglob関数でファイル名のみ取得する方法を現役エンジニアが解説【初心者向け】, Pythonのglobモジュールを利用して指定パス内のjsonファイル一覧を取得する方法を現役エンジニアが解説【初心者向け】, Pythonでファイルリストをサブディレクトリも含めて取得する方法を現役エンジニアが解説【初心者向け】, Rubyでdirectoryをsearchする方法を現役エンジニアが解説【初心者向け】, Pythonにおけるフォルダ内のファイル検索方法について現役エンジニアが解説【初心者向け】. まとめ [PR] PHPのプログラミングで挫折しない学習方法を動画で公開中親ディレクトリからファイルをインポートする方法 サブファイルは['white.ipynb']です。 └─folder   glob($パスのパターン [, $glob関数専用のフラグ]) [PR] PHPのプログラミングで挫折しない学習方法を動画で公開中ディレクトリパスを取得する $files = glob("directory/*. このようにして、sample.pyやtest.pyなどのファイルパスの一覧を簡単に取得できるのです。 (f) 田島悠介 ./testdir3     -- dog_food.txt 大石ゆかり globモジュールをインポートしたら、モジュールの中のglob()という関数を用いてファイルパスを取得していきます。モジュール名と関数名が同じであるという点に少し注意が必要です。glob()関数の引数には、探索したいファイルまでのパスをパターンとして渡します。 現在のファイルまでのパスを取得する場合は、マジカル定数の__FILE__を使用します。 親ディレクトリ ''; $list .= '
  • '.$dir[$i]. │ program1.py 説明 ?>   使い方を理解して使えるようにしましょう。 大石ゆかり globモジュールを利用してファイルリストを取得する方法 今いるディレクトリの親ディレクトリ(上のディレクトリ)へ移動します。どんなに長くても構いませんので、例えば ../../Guest/Publicといった入力も可能です。 } 田島悠介 田島悠介 大石ゆかり TEST/test01.txt 分かりました。ありがとうございます!   コメント.       -- rabbit_food.txt os.walk関数を利用してファイルリストを取得する方法 glob関数とは まずは、現在のディレクトリをpwdコマンドで確認します。/Users/Guestのディレクトリにいることがわかりますね。 今回のサンプルコードでは実行ファイルと同じディレクトリに新たなディレクトリを作成するコードを作成します。 import glob 大石ゆかり /var/www/ ディレクトリとは まとめ プログラマーの技術や経験の暴露ブログです。何か聞きたいことがあれば遠慮なくご連絡ください。, 指定したディレクトリ内のファイル名を一覧で取得したい場合、PHPにはglob()という関数があります。, 引数にはディレクトリ名を指定するのですが、ワイルドカード(*)が使えるのでディレクトリ内のファイル名やサブディレクトリ名を取得することができます。, ただ指定したディレクトリ内の一覧を取得するだけでなく、ちょっとした小細工も試してみました。, glob() の引数にディレクトリ名を入れると、そのディレクトリ内の全てのファイル名とディレクトリ名を返してくれます。, 例えば、あるPHPファイルと同じ階層に「images」というディレクトリを作成し、画像を配置したとします。, そこに、* をつけることで、「全て」という意味を加えで、「imagesディレクトリの中の全て」になります。, やり方は簡単で、第2引数にオプションを設定できるのですが、そこに GLOB_ONLYDIR を設定するだけです。, GLOB_BRACE は複数の条件を指定でき、{a,b,c}のように書くと、条件aもしくは条件bもしくは条件cのようになります。, 上のように書けば、jpgとjpeg、pngの3つの拡張子のファイルを出力することができます。, 指定したディレクトリの中のディレクトリ(サブディレクトリ)の中もまとめて一覧表示したい場合の方法です。, そういう場合は繰り返して掘り下げていく感じですが、こういうのを再帰的って言うんでしたっけ?ぶっちゃけこういう言葉覚えるの苦手なんです(笑), その掘り下げる方法に関してももっといい方法があるかもしれませんが、僕なりに作成してみたので参考にどうぞ。, 面倒ですが、1つ関数(globAll)を作成して、結果の一覧の要素がファイルで無い場合は再度関数を実行するといった内容です。, 拡張子を指定する方法や、ディレクトリだけ取得する方法、サブディレクトリも掘り下げて一覧を取得する方法など紹介しましたが、他にも気になることがあればご質問ください。, はじめまして、原口と申します。 foreach (glob("TEST/*") as $filename) { 「任意のファイル名.任意の拡張子」のファイルとはすべてのファイルに当てはまるパターンのため、ディレクトリ内のすべてのファイルを取得できます。 puts f if FileTest.directory? それ以前のバージョンの場合は、下記のようにして取得しましょう。 $txt_files = glob("directory/*.txt"); それでは、glob関数を使用してディレクトリ内のファイル一覧を取得する方法について解説します。 │ sample1.txt 実際に書いてみよう 出力結果 [PR] PHPのプログラミングで挫折しない学習方法を動画で公開中実際に書いてみよう