Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Список файлов в директории


Автор: Legafor 20.7.2004, 06:57
Суть проблемы:
есть путь к директории, необходимо получить имена всех файлов в ней хранящихся.
(что-то типа команды dir в ДОСе, только она еще и имена директорий выводит, это не нужно)
Подскажите пожалуйста, как реализовать на Perl.
Спасибо заранее.

Автор: Secandr 20.7.2004, 08:16
opendir
readdir
closedir

Автор: GoodBoy 20.7.2004, 09:56
Код
my @arr = glob('/путь/к/каталогу/*.*');

Автор: Secandr 20.7.2004, 10:16
вот тут два скрипта.
http://forum.vingrad.ru/index.php?showtopic=26477

Автор: dimes 20.7.2004, 10:36
Цитата(GoodBoy @ 20.7.2004, 09:56)
Код
my @arr = glob('/путь/к/каталогу/*.*');

Я могу ошибаться, но по-моему это не вернет файлы без расширения и скрытых файлов

возможно проще зделать так:
Код

my $d_path="dir";
opendir(dir,$d_path) or print $!;
my @arr=grep { -f  $d_path."/".$_} readdir(dir);
closedir(dir);

Автор: GoodBoy 20.7.2004, 10:59
Цитата(dimes @ 20.7.2004, 11:36)
Цитата(GoodBoy @ 20.7.2004, )
Код
my @arr = glob('/путь/к/каталогу/*.*');

Я могу ошибаться, но по-моему это не вернет файлы без расширения и скрытых файлов


можно попробовать так:
Код
my @arr = glob('/путь/к/каталогу/*');

Автор: Legafor 20.7.2004, 11:28
Спасибо большое, проблема решена........... smile.gif

Код

my @arr = glob('/путь/к/каталогу/*.*');
- возвращает имена всех файлов


Код

my @arr = glob('/путь/к/каталогу/*');
- возвращает имена всех файлов и директорий


Еще раз спасибо!

Автор: korob2001 20.7.2004, 17:01
Цитата

Спасибо большое, проблема решена...........

Э-эээ подожди. Дело в том, что вариант с glob менее эфективен чем opendir(), readdir() и closedir(). Если в каталоге будет слишком много файлов, то glob не вернёт все файлы, так как она имеет ограничение на кол-во файлов, в отличии от readdir().

Автор: Secandr 21.7.2004, 08:31
Я привёл ссылку на скрипт, в котором идёт поиск всех файлов в данном и во вложеных каталогах. А упростить его дело не трудно smile.gif

Автор: y0sh1 26.8.2004, 10:57
Как подсчитать в директории объём всех файлов скажем с расширением *.doc!? Те по маске...
Заранее спасибо!

Автор: korob2001 26.8.2004, 11:09
Цитата

Как подсчитать в директории объём всех файлов скажем с расширением *.doc!? Те по маске...
Заранее спасибо!

Помоему это уже другая тема. Если есть желание что бы кто-нибудь ответил, создайте новую тему.

Автор: GoodBoy 26.8.2004, 11:17
Код
my $size = 0;
$size += (stat($_))[7] for (glob('/путь/к/каталогу/*.doc'));
print "Общий размер файлов *.doc - $size байт";

Автор: y0sh1 26.8.2004, 12:49
GoodBoy
спасибо... постараюсь прикрутить к основному скрипту...

Автор: y0sh1 30.8.2004, 13:01
При рекурсивном просмотре директории это делается как-то медлено...
Код
sub dir_ls {
       my $save_dir;
       my $root = shift;
       local *DIR_LS;
       opendir DIR_LS ,$root;
       while (my $file = readdir (DIR_LS) ) {
.............
           if (-d "$root/$file") {
              dir_ls ("$root/$file");
              }
     else {
...............
  }
              }
       }
}

Может есть конструкция работующая быстрее!? Или они в целом более менее равны по быстродействию!?

Автор: ElectricalStorm 30.8.2004, 17:29
я не думаю что это быстрее ... но зато короче ;)

Код

#!/usr/bin/perl

use strict;

my $dir = $ARGV[0];
print join "\n" ,readDir($dir);

sub readDir {
    my $dir = shift;
    opendir local *D, $dir;
    return
       map  { my $p="$dir/$_"; -d $p?($p,readDir($p)):$p }
       grep { !/^\.\.?$/ } readdir(D);
}

Автор: y0sh1 30.8.2004, 18:25
понял, спасибо... попытаюсь разобраться...

Автор: olexdj 4.6.2013, 05:28
Подскажите плиз, есть директория с картинками вида:

124134.jpg
123356.jpg
12413545.jpg
15346356.jpg
124123556.jpg

Короче "наборцифр.jpg"

Цифры не попорядку, могут быть дырки.
Мне надо узнать самую большую цифру, чтобы писать в директорию новую картинку с большей цифрой на единицу.
Подскажите плиз, как наиболее эффективно это сделать.

Спасибо заранее!!!!!

Добавлено через 6 минут и 29 секунд
Пока сваял такого монстра:

Код

opendir(DIR, "F:/Internet/foto");
my @files = grep(/\.jpg$/,readdir(DIR));
closedir(DIR);

for ($s=0; $s<@files; $s++) {
    $files[$s] =~ s/.jpg//i;
}

@files = sort {$b <=> $a} @files;

$max_num = $files[0];


Но это ж ужас скоко работы для одной циферки ((((
Да, картинок сейчас около 25000 в директории, будет еще больше...

Автор: arto 4.6.2013, 08:03
# for i in {1..25000}; do touch $RANDOM.jpg; done
# time perl -le 'open F,"ls -1v *.jpg|";@a=<F>;chomp@a;print ($a[-1])'
32766.jpg
Real: 0.08s User: 0.00s System: 0.00s Percent: 4%% Cmd: perl -le 'open F,"ls -1v *.jpg|";@a=<F>;chomp@a;print ($a[-1])'
# time perl -le 'opendir D,"."; print ((sort{$b<=>$a}map{(split"\\.",$_)[0]}grep/\.jpg/,readdir D)[0].".jpg")'
32766.jpg
Real: 0.03s User: 0.02s System: 0.01s Percent: 87%% Cmd: perl -le 
#

Добавлено через 5 минут и 49 секунд
ну и самое простое -- записывать имя самого последнего созданного файла.

Автор: ginnie 4.6.2013, 11:00
Цитата(arto @  4.6.2013,  08:03 Найти цитируемый пост)
ну и самое простое -- записывать имя самого последнего созданного файла.

Этот вариант, кроме того, позволит (при использовании блокировки) правильно работать нескольким одновременно запущенным экземплярам программы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)