【Perl】ディレクトリ内のファイルとディレクトリの一覧を表示する

Perl

この記事では、Perlを使用してディレクトリ内のファイルやフォルダの一覧を表示する方法を紹介します。

サンプル1:ファイルとディレクトリをすべて表示

#!/usr/bin/perl

use strict;
use warnings;

# 対象のディレクトリパス
my $dir_path = '/path/to/directory';

# ディレクトリを開く(1)
opendir(DIR, $dir_path) or die( "ディレクトリ '$dir_path' を開けません: $!" );

# ディレクトリ内のファイルを読み込む(2)
while (my $file = readdir(DIR)) {
    # '.' や '..' などのディレクトリ自体や親ディレクトリを除外(3)
    next if ($file =~ m/^\./);

    # フルパスを作成
    my $full_path = "$dir_path/$file";

    # ファイル名またはディレクトリ名をフルパスで表示
    print "$full_path\n";
}

# ディレクトリを閉じる(4)
closedir(DIR);

(1)opendir関数を使用してディレクトリを開きます。失敗した場合には、エラーメッセージを出力してスクリプトを終了します。

(2)readdir関数を使ってディレクトリハンドルからファイル名を一つずつ読み込みます。読み込んだファイル名は$file変数に格納され、ループ内で処理されます。

(3)正規表現を使用して、現在のディレクトリ(.)や親ディレクトリ(..)など、名前がピリオドで始まるエントリを除外します。これにより、実際のファイルやサブディレクトリのみが処理されます。

(4)最後に、closedir関数を使ってディレクトリハンドルを閉じます。

実行結果

> sample.pl
/path/to/directory/file1.txt
/path/to/directory/file2.txt
/path/to/directory/file3.txt
/path/to/directory/subdir1

サンプル2:ファイルのみ表示

ファイルのみ表示したい場合は★印で示すフィルタ処理を追加します。if (-f $full_path) でパスがファイルの場合のみ真となり処理を行います。

#!/usr/bin/perl

use strict;
use warnings;

# 対象のディレクトリパス
my $dir_path = '/path/to/directory';

# ディレクトリを開く(1)
opendir(DIR, $dir_path) or die( "ディレクトリ '$dir_path' を開けません: $!" );

# ディレクトリ内のファイルを読み込む(2)
while (my $file = readdir(DIR)) {
    # '.' や '..' などのディレクトリ自体や親ディレクトリを除外(3)
    next if ($file =~ m/^\./);

    # フルパスを作成
    my $full_path = "$dir_path/$file";

    # ファイルのみを対象とする ★
    if (-f $full_path) {
        print "$full_path\n";
    }
}

# ディレクトリを閉じる(4)
closedir(DIR);

実行結果

/path/to/directory/file1.txt
/path/to/directory/file2.txt
/path/to/directory/file3.txt

サンプル3:ディレクトリのみ表示

ディレクトリのみ表示したい場合は★印で示すフィルタ処理を追加します。if (-d $full_path) でパスがディレクトリの場合のみ真となり処理を行います。

#!/usr/bin/perl

use strict;
use warnings;

# 対象のディレクトリパス
my $dir_path = '/path/to/directory';

# ディレクトリを開く(1)
opendir(DIR, $dir_path) or die( "ディレクトリ '$dir_path' を開けません: $!" );

# ディレクトリ内のファイルを読み込む(2)
while (my $file = readdir(DIR)) {
    # '.' や '..' などのディレクトリ自体や親ディレクトリを除外(3)
    next if ($file =~ m/^\./);

    # フルパスを作成
    my $full_path = "$dir_path/$file";

    # ディレクトリのみを対象とする ★
    if (-d $full_path) {
        print "$full_path\n";
    }
}

# ディレクトリを閉じる(4)
closedir(DIR);

実行結果

> sample.pl
/path/to/directory/subdir1
タイトルとURLをコピーしました