Perlに与えられたディレクトリの内容を配列に読み込ませるにはどうすればよいですか?Perlでディレクトリの内容を読み込むにはどうすればよいですか?
Backticks「scandir」などの用語を使用する方法はありますか?
Perlに与えられたディレクトリの内容を配列に読み込ませるにはどうすればよいですか?Perlでディレクトリの内容を読み込むにはどうすればよいですか?
Backticks「scandir」などの用語を使用する方法はありますか?
opendir(D, "/path/to/directory") || die "Can't open directory: $!\n";
while (my $f = readdir(D)) {
print "\$f = $f\n";
}
closedir(D);
EDIT:ああ、申し訳ありませんが、「配列に」の部分を逃した:
my $d = shift;
opendir(D, "$d") || die "Can't open directory $d: $!\n";
my @list = readdir(D);
closedir(D);
foreach my $f (@list) {
print "\$f = $f\n";
}
EDIT2:他の回答のほとんどは有効ですが、私はその中で、特にthis answerにコメントしたかったですこのソリューションは提供されています:
opendir(DIR, $somedir) || die "Can't open directory $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
まず、ポスターはなかったので、それはやっているものを文書化する:それはgrep()トンを通じてreaddir()から返されたリストを渡していますhatはファイル(ディレクトリ、デバイス、名前付きパイプなどとは対照的に)であり、ドットで始まらない値(リスト名@dots
を誤解を招く)を返すだけですが、それは彼がコピーしたときの変更によるものですreaddir()のドキュメントを参照してください)。それは返されるディレクトリの内容を制限するので、私はそれが技術的にこの質問に対する正しい答えだとは思わないが、ファイル名をフィルタリングするために使用される一般的なイディオムを示しており、文書化する価値があると思った。たくさん見てもう一つの例は次のとおりです。
@list = grep !/^\.\.?$/, readdir(D);
このスニペットは以外のディレクトリハンドルD からすべての内容を読み取り「」 '..'のように表示されることはほとんどありません。
これは、1つの行(末尾の「*」ワイルドカードを注意してください)
@files = </path/to/directory/*>;
# To demonstrate:
print join(", ", @files);
は、ここに私が書いたディレクトリ構造とファイルをコピーするfromaバックアップスクリプトを使用して再帰の例ですで、それを行います。
sub copy_directory {
my ($source, $dest) = @_;
my $start = time;
# get the contents of the directory.
opendir(D, $source);
my @f = readdir(D);
closedir(D);
# recurse through the directory structure and copy files.
foreach my $file (@f) {
# Setup the full path to the source and dest files.
my $filename = $source . "\\" . $file;
my $destfile = $dest . "\\" . $file;
# get the file info for the 2 files.
my $sourceInfo = stat($filename);
my $destInfo = stat($destfile);
# make sure the destinatin directory exists.
mkdir($dest, 0777);
if ($file eq '.' || $file eq '..') {
} elsif (-d $filename) { # if it's a directory then recurse into it.
#print "entering $filename\n";
copy_directory($filename, $destfile);
} else {
# Only backup the file if it has been created/modified since the last backup
if((not -e $destfile) || ($sourceInfo->mtime > $destInfo->mtime)) {
#print $filename . " -> " . $destfile . "\n";
copy($filename, $destfile) or print "Error copying $filename: $!\n";
}
}
}
print "$source copied in " . (time - $start) . " seconds.\n";
}
IO::Dirもあり、結び付けられたハッシュインターフェースも提供します。 perldocから
:
use IO::Dir;
$d = IO::Dir->new(".");
if (defined $d) {
while (defined($_ = $d->read)) { something($_); }
$d->rewind;
while (defined($_ = $d->read)) { something_else($_); }
undef $d;
}
tie %dir, 'IO::Dir', ".";
foreach (keys %dir) {
print $_, " " , $dir{$_}->size,"\n";
}
ようなので、あなたが何かをすることができます:迅速かつ汚いソリューションは、上記と同様にglob
@files = glob ('/path/to/dir/*');
私は最高のバージョンが "perldoc -f readdir"から(わずかに変更されている)と思う:
opendir(DIR, $somedir) || die "can't opendir $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
を使用することです
tie %dir, 'IO::Dir', $directory_name;
my @dirs = keys %dir;
あなたはDirHandleを使用することができます。
use DirHandle;
$d = new DirHandle ".";
if (defined $d)
{
while (defined($_ = $d->read)) { something($_); }
$d->rewind;
while (defined($_ = $d->read)) { something_else($_); }
undef $d;
}
DirHandle
はopendir()
、closedir()
、readdir()
、およびrewinddir()
機能に代わる、クリーンなインターフェイスを提供します。
から:http://perlmeme.org/faqs/file_io/directory_listing.html
#!/usr/bin/perl
use strict;
use warnings;
my $directory = '/tmp';
opendir (DIR, $directory) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
print "$file\n";
}
(はperldoc -fのreaddirからのコードサンプルに基づいて)次の例では、オープンディレクトリからの期間で始まるすべてのファイル(ディレクトリではない)を取得します。ファイル名は配列@dotsにあります。
#!/usr/bin/perl
use strict;
use warnings;
my $dir = '/tmp';
opendir(DIR, $dir) or die $!;
my @dots
= grep {
/^\./ # Begins with a period
&& -f "$dir/$_" # and is a file
} readdir(DIR);
# Loop through the array printing out the filenames
foreach my $file (@dots) {
print "$file\n";
}
closedir(DIR);
exit 0;
closedir(DIR);
exit 0;
誰かがこれが「間違っている」と私に説明することはできますか?クリーンでシンプルなので(他のソリューションとは異なりますが)説明なしにダウンモードされています。 – rix0rrr
globbingが使用されているシェルに依存していることを読んだことはほとんどありません。 – maaartinus
これは最高の解決策です。それはきれいで、私にとっては完璧に機能しました。 – mikemeli