Вопрос по directory, perl – Как я могу перечислить все файлы в каталоге с Perl? [Дубликат]

47

This question already has an answer here:

How do I read in the contents of a directory in Perl? 8 answers

Есть ли в Perl функция, которая перечисляет все файлы и каталоги в каталоге? Я помню, что Java имеетFile.list() сделать это? Есть ли в Perl сопоставимый метод?

Ваш Ответ

6   ответов
11

это должно сделать это.

my $dir = "bla/bla/upload";
opendir DIR,$dir;
my @dir = readdir(DIR);
close DIR;
foreach(@dir){
    if (-f $dir . "/" . $_ ){
        print $_,"   : file\n";
    }elsif(-d $dir . "/" . $_){
        print $_,"   : folder\n";
    }else{
        print $_,"   : other\n";
    }
}
это лучший способ, когда я не хочу или не хочу запоминать регулярные выражения для чего-то, что должно быть легко сделать, я буду использовать это для создания функции, подобной list ($ dir, & quot; f & quot;); для файлов & quot; d & quot; за каталог, спасибо за размещение этого
Вам следует проверить opendir на наличие ошибок (opendir ... или die & quot; Сообщение об ошибке: $! & Quot;). Кроме того, я что-то упустил? Что здесь делает Win32 :: GUI :: DoEvents ()? (Я не вижу ничего уместного в этом вопросе.)
3

Если вы бездельник, как я, вы можете использоватьФайл :: Slurp модуль. Функция read_dir считывает содержимое каталога в массив, удаляет точки и, если необходимо, ставит префикс файлов, возвращаемых с dir, для абсолютных путей

my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
12

readdir () делает это.

Проверьтеhttp://perldoc.perl.org/functions/readdir.html

opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
79

без подкаталогов), лучше всего использовать opendir / readdir / closedir:

opendir my $dir, "/some/path" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;

Вы также можете использовать:

my @files = glob( $dir . '/*' );

Но, на мой взгляд, это не так хорошо - в основном потому, что glob - довольно сложная вещь (может фильтровать результаты автоматически), и использование его для получения всех элементов каталога кажется слишком простой задачей.

С другой стороны, если вам нужно получить контент из всех каталогов и подкаталогов, есть в основном одно стандартное решение:

use File::Find;

my @content;
find( \&wanted, '/some/path');
do_something_with( @content );

exit;

sub wanted {
  push @content, $File::Find::name;
  return;
}
Спасибо за то, что не одобряете использование globbing для этой задачи. Еще один недостаток использования globbing для этого заключается в том, что он не найдет скрытые файлы (те, которые начинаются с точки).
Я всегда забываю, что readdir просто возвращает список относительных имен файлов, а не весь путь!
2

Это перечислит Все (включая подкаталоги) из каталога, который вы укажете, по порядку и с атрибутами. Я потратил несколько дней на поиски чего-то, что могло бы сделать это, и я взял части из всего этого обсуждения, и немного своего, и собрал все это. НАСЛАЖДАТЬСЯ!!

#!/usr/bin/perl --
print qq~Content-type: text/html\n\n~;
print qq~<font face="arial" size="2">~;

use File::Find;

# find( \&wanted_tom, '/home/thomas/public_html'); # i,f you want just one website, uncomment this, and comment out the next line
find( \&wanted_tom, '/home');
exit;

sub wanted_tom {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
$mode = (stat($_))[2];
$mode = substr(sprintf("%03lo", $mode), -3);

if (-d $File::Find::name) {
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
 } else {
print "$File::Find::name --ATTR:$mode<br>";
 }
  return;
}
... сказал каждый программист на Perl
Аааа, мои глаза!
11

Или жеFile :: Find

use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };

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

Похожие вопросы