特定のディレクトリ配下を再帰的にたどりファイル一覧を表示などしたい。
階層の深さが決まっていればかんたんに取得できる方法もあるが、階層はまちまちで、今後もダイナミックに変化していく。このような場合にはどうすれば良いだろうか。
方法はいくつかある。
- Linuxなどのコマンドを使う
- オリジナルの関数を用意する (Perlの場合)
- File::Findモジュールを使用する (Perlの場合)
ls -R
表示するだけであれば、お手軽なのは ls のオプションを利用する方法である。Rオプションをつけて実行すると、ディレクトリがあった場合、そのディレクトリ以下のファイルも再帰的に表示してくれる。
以下の実行例では2階層までしかないが、最後まで面倒を見てくれる。その他のオプションと同時に利用することももちろん可能だ。 "ls -laR" などとすれば、期待通りの結果が得られる。
$ ls -R .: 200602 200603 ./200602: access_log.20060215.gz access_log.20060222 error_log.20060215.gz error_log.20060222.gz access_log.20060216 access_log.20060223 error_log.20060216.gz error_log.20060223.gz ./200603: access_log.20060301 access_log.20060312 error_log.20060301.gz error_log.20060312.gz access_log.20060302 access_log.20060313 error_log.20060302.gz error_log.20060313.gz
ls -1
上記の実行例だと、実行結果がプログラムなどから再利用しづらい。そういった時には "-1" オプションを利用する。
.: 200602 200603 ./200602: access_log.20060215.gz access_log.20060216 access_log.20060222 access_log.20060223 error_log.20060215.gz error_log.20060216.gz error_log.20060222.gz error_log.20060223.gz ./200603: access_log.20060301 access_log.20060302 access_log.20060312 access_log.20060313 error_log.20060301.gz error_log.20060302.gz error_log.20060312.gz error_log.20060313.gz
find
これ以外にもfindを利用する方法もあるが、findはOSによって利用方法(実装)が異なる。ここではLinuxで採用されているGNU Linuxのみしか確認していないので他OSを利用する場合は動作を確認してから利用されることをオススメする。
$ find . . ./200603 ./200603/error_log.20060301.gz ./200603/error_log.20060302.gz ./200603/error_log.20060312.gz ./200603/error_log.20060313.gz ./200603/access_log.20060301 ./200603/access_log.20060302 ./200603/access_log.20060312 ./200603/access_log.20060313 ./200602 ./200602/error_log.20060215.gz ./200602/error_log.20060216.gz ./200602/error_log.20060222.gz ./200602/error_log.20060223.gz ./200602/access_log.20060216 ./200602/access_log.20060222 ./200602/access_log.20060223 ./200602/access_log.20060215.gz
findなので特定のパターンのファイル名の物のみを表示するなどの芸当が可能(というか本来の利用方法はそれだ(笑))