어떻게 펄을 주어진 디렉토리의 내용을 배열로 읽어 들일 수 있습니까?Perl의 디렉토리 내용을 어떻게 읽습니까?
Backticks도 가능하지만 'scandir'또는 이와 유사한 용어를 사용하는 방법이 있습니까?
어떻게 펄을 주어진 디렉토리의 내용을 배열로 읽어 들일 수 있습니까?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);
편집 : 아, 죄송합니다 "배열로"부분을 놓친 :
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()t을 통해 readdir()에서 반환 된 목록을 통과하는 것 hat은 파일 (디렉토리, 장치, 명명 된 파이프 등과는 대조적으로)이면서 도트로 시작하지 않는 값 (목록 이름 @dots
을 오도할만한 값만 반환합니다. 그러나 그 값은 복사 할 때 변경 한 것이기 때문입니다 readdir() 문서에서). 그것이 반환하는 디렉토리의 내용을 제한하기 때문에, 나는 기술적으로이 질문에 대한 정답이라고 생각하지 않지만, Perl에서 파일 이름을 필터링하는 데 사용되는 일반적인 관용구를 보여 주므로 문서화하는 것이 중요하다고 생각했습니다. 많이 본 또 다른 예는 다음과 같습니다
@list = grep !/^\.\.?$/, readdir(D);
이 조각은 제외하고 디렉토리 핸들 D 의 모든 내용을 읽고 '.' '..'는 목록에 사용되는 것이 거의 필요 없기 때문에.
이 한 줄 (마지막에 '*'와일드 카드를 주)
@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";
}
그래서 당신은 같은 것을 할 수있는 :
tie %dir, 'IO::Dir', $directory_name;
my @dirs = keys %dir;
가 신속하고 더러운 솔루션이 사용하는 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;
당신은 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