Belirli bir dizinin içeriğini bir dizide okumak için Perl'i nasıl edinebilirim?Perl'de bir dizinin içeriğinde nasıl okurum?
Backticks bunu yapabilir, ancak 'scandir' veya benzer bir terimin kullanıldığı bir yöntem var mı?
Belirli bir dizinin içeriğini bir dizide okumak için Perl'i nasıl edinebilirim?Perl'de bir dizinin içeriğinde nasıl okurum?
Backticks bunu yapabilir, ancak 'scandir' veya benzer bir terimin kullanıldığı bir yöntem var mı?
opendir(D, "/path/to/directory") || die "Can't open directory: $!\n";
while (my $f = readdir(D)) {
print "\$f = $f\n";
}
closedir(D);
DÜZENLEME: Pardon, "bir diziye" bölümünü cevapsız:
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: diğer cevapların çoğu geçerlidir, ancak ben, özellikle this answer yorum istedim hangi Bu çözüm sunulmaktadır:
opendir(DIR, $somedir) || die "Can't open directory $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
Birincisi, afiş yoktu çünkü ne yaptığını belgelemek için: bir grep() t aracılığıyla readdir() döndü liste geçiriyor şapka dosyaları (dizinler, aygıtlar, adlandırılmış yöneltmeler, vb. aksine) olan ve bir nokta ile başlamıyor olan değerleri döndürür (bu, liste adını @dots
'u yanıltıcı kılar; ancak bu, kopyalama sırasında yaptığı değişiklikten kaynaklanır) readdir() belgelerinden). Geri döndüğü dizinin içeriğini sınırladığı için, teknik olarak bu soruya doğru bir cevap olduğunu düşünmüyorum, ancak dosya adlarını Perl içinde filtrelemek için kullanılan yaygın bir deyimi gösterir ve belgenin değerli olacağını düşündüm. çok görülen bir diğer örneği:
@list = grep !/^\.\.?$/, readdir(D);
Bu pasajı hariç dizin kolu D tüm içeriğini okur. '' ve '..', çünkü bu listede çok nadiren aranıyor.
Bu bir satırda (sonunda '*' joker dikkat)
@files = </path/to/directory/*>;
# To demonstrate:
print join(", ", @files);
İşte yazdığım bir dizin yapısı ve kopyalama dosyaları froma yedekleme komut dosyası aracılığıyla recursing bir örnek de, bunu yapacağız.
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 güzel ve aynı zamanda bir bağladılar karma arayüz sağlar. perldoc itibaren
:
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";
}
Yani böyle bir şey yapabileceğini:
tie %dir, 'IO::Dir', $directory_name;
my @dirs = keys %dir;
Hızlı ve kirli çözüm kullanmak glob
yukarıdaki benzer@files = glob ('/path/to/dir/*');
, "glob" penceresindeki yollarda beklendiği gibi çalışmadığına dikkat çekiyor - http://stackoverflow.com/questions/7898496/can-not-list-directory-including-space-using-perl-in -windows-platform – Kip
bazen kirli çözümler iyi çalışıyor. – serenesat
Bu ayrıca gizli dosyaları (nokta ile başlayanlar) da bulamayacaktır. – josch
, ama bence en iyi sürüm "perldoc -f readdir" den (biraz değiştirilmiş):
opendir(DIR, $somedir) || die "can't opendir $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
Sen DirHandle kullanabilirsiniz:
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()
ve rewinddir()
işlevlerine alternatif, daha temiz bir arayüz sağlar.dan
: 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 bir kod örneği temel) Aşağıdaki örnek açık dizinden bir süre ile başlayan tüm dosyaları (değil dizinleri) alır. Dosya adları @dots dizisinde bulunur.
#!/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;
Birisi bana bunun neden "yanlış" olduğunu açıklayabilir mi? Çünkü temiz ve basittir (bazı diğer çözümlerin aksine), ancak açıklama yapılmaksızın aşağı çekilmiştir. – rix0rrr
Örtücülüğün kullanılan kabuğa bağımlı olduğunu okuduğunu neredeyse hatırlıyorum, belki de bu yüzden. – maaartinus
Bu en iyi çözüm, temiz ve benim için mükemmel çalıştı. – mikemeli