ディレクトリを再帰的にたどりファイル一覧を表示する - Linux

この記事は2006年10月07日に書かれたものです。

特定のディレクトリ配下を再帰的にたどりファイル一覧を表示などしたい。

階層の深さが決まっていればかんたんに取得できる方法もあるが、階層はまちまちで、今後もダイナミックに変化していく。このような場合にはどうすれば良いだろうか。

方法はいくつかある。

  1. Linuxなどのコマンドを使う
  2. オリジナルの関数を用意する
  3. File::Findモジュールを使用する

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なので特定のパターンのファイル名の物のみを表示するなどの芸当が可能(というか本来の利用方法はそれだ(笑))

関連書籍

コメント

コメントを入力. Wiki文法が有効です:
B​ D L H X