The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как найти фалы по дате"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Как найти фалы по дате"  +/
Сообщение от Elfin83 (ok) on 03-Ноя-13, 13:26 
Необходимо получить массив файлов, созданных в определенную дату.
Дату файла планирую получить как ctime из stat().

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

Можно ли сделать как-то проще? Только начинаю разбираться с perl и могу не знать каких-то встроенных функций.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как найти фалы по дате"  +/
Сообщение от parad (ok) on 03-Ноя-13, 14:17 
даже если надешь встроенный функционал - он будет работать через перебор.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как найти фалы по дате"  +/
Сообщение от михалыч (ok) on 03-Ноя-13, 18:26 
> Необходимо получить массив файлов, созданных в определенную дату.
> Дату файла планирую получить как ctime из stat().
> Но мне кажется довольно накладным перебирать все файлы в папке и проверять
> для каждого из них, совпадает ли значение ctime с заданным.
> Можно ли сделать как-то проще? Только начинаю разбираться с perl и могу
> не знать каких-то встроенных функций.

Держи


#!/usr/bin/perl


use strict;
use warnings;


my @arr;
my $mytime = "1336368111";
my $dir = "/usr/home";


opendir ( DH, $dir ) or die "couldn't open $dir : $!";


while ( my $file = readdir ( DH ) ) {
    next if $file =~ /^\.\.?$/;
    next if -d "$dir/$file";


    my $mod = ( stat "$dir/$file" )[10];
    push @arr, $file if $mod == $mytime;
}


closedir ( DH );


while ( <@arr> ) { print $_, "\n"; }


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Как найти фалы по дате"  +/
Сообщение от Elfin83 (ok) on 04-Ноя-13, 07:40 
Спасибо! Значит придётся таки перебором.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Как найти фалы по дате"  +/
Сообщение от Elfin83 (ok) on 07-Ноя-13, 15:15 
Спасибо всем, скрипт написан. Может быть будет кому-то полезен. Назначение - сортировка кучи файлов по дате создания в дерево папок вида Год/Месяц/День. В этом виде в скрипт передаются 2 параметра: папка - источник файлов, и папка, в которой будет создаваться дерево папок.

#!/usr/local/bin/perl
# Фотографии в папке. Раскладвыаем их по дереву папок в соответствии с годом и месяцем создания. Если папка, соотвтетсвующая году или месяцу отстутствует, создаем ее.

use strict;
use File::Copy;
use File::Path;
use Time::Local;


# Проверяем, заданы ли необходимые аргументы
unless (defined $ARGV[0] || defined $ARGV[1])
{
    print ("При  вызове скрипта необходимо указать аргументы: папка-источник, папка-корень дерева\n");
    die;
}

# берем имя папки, если задано аргументом командной строки
my $sourcedir = $ARGV[0];
my $photodir = $ARGV[1];

my $size;
my @files;
my $firstfile;
my $ctime;
my @time;
my $year;
my $month;
my $day;
my $filetime;

sortphoto($sourcedir, $photodir);

sub sortphoto
{
    do
    {
        # Получем все файлв в папке. Берем первый файл, определяем для него year, month, day
        @files = glob ("$sourcedir/*.*");
        $firstfile = $files[0];
        $ctime = (stat "$firstfile")[10];
        @time = localtime($ctime);
        $year = 1900 + $time[5];
        $month = 1+ $time[4];
        $day = $time[3];

        # Создаем папку, соответствующую дате (если еще не создана)

        mkpath("$photodir/$year/$month/$day");

        # Ищем файлы, дата которых совпадает с датой создания первого файла
        foreach (@files)
        {
            $filetime = (stat $_)[10];
            if ( $filetime == $ctime)
            {
                # Переносим файл в папку, соответствующую дате
                move("$_", "$photodir/$year/$month/$day") or die "The move operation failed: $!";
            }
        }
    
        # Пока в папке sourcedir есть файлы, продолжаем
        # Определяем количество элементов в массиве файлов (берем индекс последнего элемента плюс 1)
        $size = $#files + 1;        
    
    } while ($size > 0);
}


Если кто-то найдет ошибки, с удовольствием исправлю. Также жду любых замечаний, недавно изучаю язык, но хотелось бы совершенствоваться.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру