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

Я ищу способ в Perl перечислить простые файлы каталога. Только файлы, без каталогов.

Ответы [ 6 ]

11 голосов
/ 12 мая 2010

Вам необходимо использовать функции opendir, readdir и closedir в сочетании с оператором проверки файлов -f:

opendir(my $dh, $some_dir) || die $!;
while(my $f = readdir $dh) {
    next unless (-f "$some_dir/$f");
    print "$some_dir/$f\n";
}
closedir $dh;
5 голосов
/ 12 мая 2010

Еще один способ вывести список всех файлов в каталоге - использовать функцию read_dir из модуля CPAN File :: Slurp :

use strict;
use warnings;
use File::Slurp qw(read_dir);

my $dir = './';
my @files = grep { -f } read_dir($dir);

Он выполняет проверки Opendir для вас. Имейте в виду, что он включает в себя любые «скрытые» файлы (те, которые начинаются с точки). Это не приводит к рекурсивному списку файлов в подкаталогах указанного каталога.

3 голосов
/ 12 мая 2010

Вы можете использовать файловый тест «оператор» (на самом деле функция), чтобы проверить, какой тип файла вы хотите.

В простом случае, когда вы хотите просканировать текущий каталог, используйте файл glob с grep:

my @files = grep -f, <*>;

В противном случае вы можете работать с дескриптором каталога:

opendir my $dh, $dirpath;

my @files = grep -f, readdir( $dh );

closedir $dh;

См. opendir , readdir , closedir , -X и grep .

2 голосов
/ 12 мая 2010

Использовать Файл :: Найти . Это основной модуль.

use File::Find;
find(\&wanted, @directories_to_search);
sub wanted 
{ 
   my $file = shift;
   return unless (-f $file);
   #process file
}
1 голос
/ 13 мая 2010

File :: Find :: Rule из CPAN делает это совершенно тривиальным:

use File::Find::Rule;
my @files = File::Find::Rule->file->in( $directory );

Находит все файлы в данном каталоге или любом из его подкаталогов. Я рекомендую это из-за сочетания чрезвычайной гибкости и простоты.

1 голос
/ 12 мая 2010

Требуется оператор readdir.

Например:

#! /usr/bin/perl

use warnings;
use strict;

my $dir = "/tmp/foo";
opendir my $dh, $dir
  or die "$0: opendir: $!";

while (defined(my $name = readdir $dh)) {
  next unless -f "$dir/$name";
  print "$name\n";
}

Запуск:

$ ls -F /tmp/foo
a  b  c  d/

$ ./prog.pl 
b
c
a

Как видите, имена выводятся в том порядке, в котором они физически хранятся в файловой системе, что не обязательно сортируется.

Чтобы пойти по быстрому и грязному маршруту, вы также можете использовать оператор glob, как в

print map { s!^.*/!!; "$_\n" }
      grep !-d $_ =>
      </tmp/foo/*>;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...