PerlならサンプルコードPerl入門

2008-05-29

glob関数 - カレントディレクトリのファイル一覧を取得する

  1. Perl
  2. 関数
  3. glob

 ファイル一覧を取得するにはglob関数を使用します。

my @all_files = glob "*"; 

 ファイル一覧を取得するには、glob 演算子を使います。対象は、カレントディレクトリのファイル(ディレクトリを含む)になります。別のディレクトリのファイル一覧を取得したときは、 chdir で、カレントディレクトリを移動するか、相対パスあるいは、絶対パスで、表現します。

glob の引数の表現例

"*".で始まらない、すべてのファイル
"*.txt".txt で終わるファイル
"*.txt *.pl.txt あるいは、 .pl で終わるファイル( .txt と .pl の間に空白があります )
"* .*"すべてのファイル( * と .* の間に空白があります )
"lib/*libディレクトリ以下のファイル
c:/dir/*絶対パスで指定

 空白で、区切ると複数のパターンを指定できます。相対パス以外にも、絶対パスも使うことができます。* はUnixのシェルで用いられるワイルドカードのひとつです。glob関数は、シェルのワイルドカード展開の規則にしたがって、*を含むファイル名を展開します。

サンプル

 glob関数のサンプルです。

use strict;
use warnings;

# カレントディレクトリのファイル一覧を取得する。
# glob

print "1: カレントディレクトリのファイル一覧を取得する。\n";
# * は、. で始まらないすべてのファイルを表現
my @all_files = glob "*";
print join("\n", @all_files) . "\n\n";

print "2: .txt で終わるファイル一覧を取得する。\n" ;
my @text_files = glob "*.txt";
print join("\n", @text_files) . "\n\n";

print "3: .txt と .pl で終わるファイル一覧を取得する。\n";
# 複数パターンある場合は空白で区切る
my @text_and_pl_files = glob "*.txt *.pl"; 
print join("\n", @text_and_pl_files) . "\n\n";

print "4: 通常ファイルの一覧を取得する。\n";
my @normal_files = glob "*";
# 複雑なことをしたいときは,"*" で
# すべてのファイルを取得してから、
# grep で選別する。
@normal_files = grep{ -f $_ } @normal_files; 
print join("\n", @normal_files) . "\n\n";

 実行結果

1: カレントディレクトリのファイル一覧を取得する。
a.exe
a.pl
aaa
DBIx-Custom
dir_20080530_4944
hello.exe
hello.pl
lib
yuki-kimoto-Portablebbs-b578c1d
yuki-kimoto-Portablebbs-b578c1d.zip

2: .txt で終わるファイル一覧を取得する。


3: .txt と .pl で終わるファイル一覧を取得する。
a.pl
hello.pl

4: 通常ファイルの一覧を取得する。
a.exe
a.pl
hello.exe
hello.pl
yuki-kimoto-Portablebbs-b578c1d.zip

Windowsではglob関数は正しく動作しないのでディレクトリハンドルを使う

 ファイル一覧を取得するときにglob関数を使うことが多いと思います。けれども今のところはglob関数はWindowsでは正しく動かないと見ておいたほうがよいでしょう。ディレクトリ名に特定の文字列を含む場合は、ファイル一覧を正しく取得することができません。

 ですので、glob関数を使う代わりに、以下のようなファイル名の一覧を取得する関数を作るのがよいでしょう。ディレクトリハンドルを使う方法は正しく動くようです。

sub get_files {
  my $dir = shift;
  
  opendir my $dh, $dir
    or die qq/Can't open directory "$dir": $!/;
  
  my @dirs = map { "$dir/$_" } grep { $_ ne '.' && $_ ne '..' } readdir $dh;
  
  return @dirs;
}

 使い方

my @files = get_files('c:/pictures');

perlcodesampleperlcodesample 2008/06/01 20:35
弾さんに、glob関数は、「シェルのグロブどおりにファイル名を展開する」と説明すべきと指摘されました。

http://blog.livedoor.jp/dankogai/archives/51058540.html

ここでは、シェルのワイルドカード展開の話題は、避けましたが、補則で追加しておきます。

あと、glob関数で取得するファイル一覧というのは、ディレクトリも含みますので、誤解を生まないよう、修正しました。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証