web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルをPerlでリストするにはどうすればよいですか?

ディレクトリ内のすべてのファイルとディレクトリをリストするPerlの関数はありますか? Javaにはこれを行うFile.list()がありますか?Perlに匹敵するメソッドはありますか?

50
Paradius

指定されたディレクトリのコンテンツを取得したい場合、それだけ(つまり、サブディレクトリなし)を取得する場合、最善の方法はopendir/readdir/closedirを使用することです:

opendir my $dir, "/some/path" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;

以下も使用できます。

my @files = glob( $dir . '/*' );

しかし、私の意見では、それはあまりよくありません-主にglobは非常に複雑なものであり(結果を自動的にフィルタリングすることができます)、それを使用してディレクトリのすべての要素を取得することはあまりにも簡単なタスクのようです。

一方、すべてのディレクトリとサブディレクトリからコンテンツを取得する必要がある場合、基本的に1つの標準ソリューションがあります。

use File::Find;

my @content;
find( \&wanted, '/some/path');
do_something_with( @content );

exit;

sub wanted {
  Push @content, $File::Find::name;
  return;
}
82
user80168

readdir()はそれを行います。

チェック http://perldoc.Perl.org/functions/readdir.html

opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
12
Vinko Vrsalovic

これでうまくいくはずです。

my $dir = "bla/bla/upload";
opendir DIR,$dir;
my @dir = readdir(DIR);
close DIR;
foreach(@dir){
    if (-f $dir . "/" . $_ ){
        print $_,"   : file\n";
    }elsif(-d $dir . "/" . $_){
        print $_,"   : folder\n";
    }else{
        print $_,"   : other\n";
    }
}
11
Matthew Vines

または File :: Find

use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };

サブディレクトリが存在する場合は、サブディレクトリを通過します。

11
Todd Gardner

あなたが私のような怠け者であれば、 File :: Slurp モジュールを使用したいかもしれません。 read_dir関数は、ディレクトリの内容を配列に読み取り、ドットを削除し、必要に応じて、絶対パスのdirで返されたファイルにプレフィックスを付けます。

my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
3
Matthew Lock

これにより、指定したディレクトリのすべて(サブディレクトリを含む)が順番に、属性とともに一覧表示されます。私はこれを行うために何かを探すために何日も費やしました。楽しい!!

#!/usr/bin/Perl --
print qq~Content-type: text/html\n\n~;
print qq~<font face="arial" size="2">~;

use File::Find;

# find( \&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line
find( \&wanted_tom, '/home');
exit;

sub wanted_tom {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
$mode = (stat($_))[2];
$mode = substr(sprintf("%03lo", $mode), -3);

if (-d $File::Find::name) {
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
 } else {
print "$File::Find::name --ATTR:$mode<br>";
 }
  return;
}
2
user186884