Как я могу перечислить все файлы в каталоге, используя Perl? - PullRequest
12 голосов
/ 22 сентября 2010

Я обычно использую что-то вроде

my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;

или иногда я использую glob, но в любом случае мне всегда нужно добавить одну или две строки, чтобы отфильтровать . и .., что довольно раздражает. Как вы обычно выполняете эту общую задачу?

Ответы [ 6 ]

14 голосов
/ 22 сентября 2010
my @files = grep {!/^\./} readdir DIR;

Это исключит также все точечные файлы, но обычно это то, что вы хотите.

8 голосов
/ 22 сентября 2010

Я часто использую File :: Slurp .Преимущества включают в себя: (1) Умирает автоматически, если каталог не существует.(2) Исключает . и .. по умолчанию.Это поведение похоже на readdir в том, что оно не возвращает полные пути.

use File::Slurp qw(read_dir);

my $dir = '/path/to/dir';
my @contents = read_dir($dir);

Еще один полезный модуль - File :: Util , который предоставляет множество опций при чтении каталога.Например:

use File::Util;
my $dir = '/path/to/dir';
my $fu = File::Util->new;
my @contents = $fu->list_dir( $dir, '--with-paths', '--no-fsdots' );
7 голосов
/ 22 сентября 2010

Я обычно буду использовать glob метод:

for my $file (glob "$dir/*") {
    #do stuff with $file
}

Это прекрасно работает, если в каталоге нет большого количества файлов. В этих случаях вам нужно переключиться обратно на readdir в цикле while (поместить readdir в контекст списка так же плохо, как и glob):

open my $dh, $dir
    or die "could not open $dir: $!";

while (my $file = readdir $dh) {
    next if $file =~ /^[.]/;
    #do stuff with $file
}

Часто, если я читаю кучу файлов в каталоге, я хочу прочитать их рекурсивно. В этих случаях я использую File::Find:

use File::Find;

find sub {
    return if /^[.]/;
    #do stuff with $_ or $File::Find::name
}, $dir;
7 голосов
/ 22 сентября 2010

Если важны некоторые файлы точек,

my @files = grep !/^\.\.?$/, readdir DIR;

исключит только . и ..

2 голосов
/ 22 сентября 2010

Когда я просто хочу файлы (в отличие от каталогов), я использую grep с -f тестом:

my @files = grep { -f } readdir $dir;
0 голосов
/ 28 декабря 2014

Спасибо Крису и Эфиру за ваши рекомендации. Я использовал следующее для чтения списка всех файлов (исключая каталоги) из дескриптора каталога, ссылающегося на каталог, отличный от моего текущего каталога, в массив. В массиве всегда отсутствовал один файл, если не использовать абсолютный путь в операторе grep

use File::Slurp; 

print "\nWhich folder do you want to replace text? " ;
chomp (my $input = <>);
if ($input eq "") {
print "\nNo folder entered exiting program!!!\n";
exit 0;
} 

opendir(my $dh, $input) or die "\nUnable to access directory $input!!!\n"; 

my @dir = grep { -f "$input\\$_" } readdir $dh;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...