Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача адресса папки через командную строку 
V
    Опции темы
heluna
Дата 24.3.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Привет всем, 
извеняюсь сразу же за наверное уже не раз заданый здесь вопрос (хотя я к сожалению не нашла, то что искала)

существует перл- скрипт,  при его запуске, пользователь должен указать адрес папки с которой он хочет работать. Много раз встречала такие примеры............ и попыталась использовать его у себя, но выходят постоянно ошибки, можете подсказать, что я делаю не правильно.... может, я чего-то не знаю и не передаю в начале???? Спасибки за ранее всем...........
Код

use strict;
use warnings;
use File::Copy;
use File::Spec;
use File::Find;
use File::stat;

print "Pfad:";

my $srcDir = <STDIN>;

my %allFiles=read_dirs(File::Spec->rel2abs($srcDir)); #вызов метода

sub read_dirs
{
  my $dir = shift;
  my %files=();
  # File::Find::find 
  find(sub{
   
    return if($_ eq '.' || $_ eq '..');
    
    my $name=File::Spec->abs2rel($File::Find::name,$dir);
  
    $files{$name}=undef;
  }, $dir);
  return %files;
}


Это сообщение отредактировал(а) heluna - 24.3.2010, 22:03
PM MAIL   Вверх
RomanCh
Дата 25.3.2010, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



Честно говоря все телепаты из наших краёв уехали и потому я не очень представляю что (и зачем?) ты пытаешься сделать, и что за ошибки у тебя там выскакивают. Но мне кажется что на правильные мысли тебя может навести нечто вроде этого простого кода:

Код

#!/usr/bin/perl

use strict;

my $dirname;

do
{
    print "Enter dir name: ";
    $dirname = <STDIN>;
    chomp $dirname;
}
while( !defined $dirname || $dirname eq '');

opendir(DIR, $dirname) || die "Can't open directory '$dirname': $!";
my @files = readdir(DIR);

@files = grep {!/^\.{1,2}$/} @files;

print "Files in directory: @files\n";


PM MAIL WWW Jabber   Вверх
heluna
Дата 25.3.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



))))))))))))ok,  проблема в том, что я не могу передать pаth через dos-prompt, этот код  который ты мне написал к сожалению, тоже не  идёт, хотя я думаю, ты проблему понял и без уехавших телепатов)))))). А мой вопрос был, как передать в этом случае path через  dos-prompt))))))))))
PM MAIL   Вверх
amg
Дата 25.3.2010, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



heluna, в Вашем скрипте строка
my $srcDir = <STDIN>;
означает, что скрипт хочет получить название директории $srcDir со стандартного входа.

Это можно сделать так:
echo "c:/src/Dir" | script.pl

Если упомянутую выше строку заменить на 
my $srcDir = shift;
то синтаксис вызова скрипта будет проще:
script.pl "c:/src/Dir"


Это сообщение отредактировал(а) amg - 25.3.2010, 07:41
PM MAIL   Вверх
krypt3r
Дата 25.3.2010, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 1
Всего: 16



Код

#!/usr/bin/perl
use strict;
use warnings;

die "wrong param count\n" unless scalar @ARGV == 1;
my $path = shift;
...

В переменной $path будет переданное из командной строки значение (параметр), которое можно использовать далее в скрипте. Кроме этого, есть модули Getopt::Std и Getopt::Long.
PM MAIL   Вверх
RomanCh
Дата 25.3.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



Цитата(heluna @ 25.3.2010,  02:08)
))))))))))))ok,  проблема в том, что я не могу передать pаth через dos-prompt, этот код  который ты мне написал к сожалению, тоже не  идёт, хотя я думаю, ты проблему понял и без уехавших телепатов)))))). А мой вопрос был, как передать в этом случае path через  dos-prompt))))))))))

Эээ... Интересно, что я делаю не так?
Linux:
Код

roman@gw ~/perl $ ./test.pl /var
Enter dir name: /var
Files in directory: www lib empty cache tmp log lost+found lock bind mail db run state spool old_var svn

И конечно же всеми любимый Windows!
Код

C:\Documents and Settings\Администратор>"C:\Documents and Settings\Администратор\Рабочий стол\test.pl"
Enter dir name: C:\Documents and Settings\
Files in directory: All Users Default User gst LocalService NetworkService Novel postgres Roman.OFFICE tlntusr Администратор

Можно хотя бы узнать что "не идёт" в моём примере? Я в растерянности, мои способности к телепатии исчерпаны.
PM MAIL WWW Jabber   Вверх
heluna
Дата 26.3.2010, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Спасибо всем за ответы....вы все супер)))) Роман извени пожалуйсто, всё идёт, спасибки огромное.........))

Можно следующий вопрос.....
проверяя эту директорию, я пробегаю все находящиеся там даты, и все даты старше года я переношу в другую папку Backup, при этом я хочу создать текстфайл, где будут стоять  все названия(filename,dirname), время создачи файла или директории(lastMod) и размеры(size) в КБ от дат, которые я перенесла в другую папку. 

Выдача имён не создала мне больших трудностей, но вот размер дат и время я выдать не могу.....так как я поняла, вы тут все умнички, такчто наверное быстренько ошибку найдёте, где я опять ступила....... ещё раз спасибо!!!
Код

sub loggen
{
  my $logfile=shift;
  my $srcdir=shift;

  my %files=@_;

  
  open(my $logfh, '>', $logfile) or die "ERROR open: $logfile ($!)";

  local $\ = "\n\n";

  foreach(sort keys(%files))
  {

      my $filename=File::Spec->rel2abs($_, $srcdir);
      my $lastMod = stat($filename)->mtime();
      my $kbyte = sprintf "%.2f",($filename) /1024;

    print $logfh $filename,"  -->";
    print $logfh $kbyte,"KB \t letzter Zugrif:",$lastMod;
    print $logfh "File/Directory wurde geloescht...\n\n" if $files{$_} == DELETED;
    print $logfh "File/Directory ist aktuell...\n\n" if $files{$_} == BEHALTEN;
    print $logfh "File/Directory wurde verschoben...\n\n" if $files{$_} == LOESCHEN;
    print $logfh "File/Directory wurde verschoben...\n\n" if $files{$_} == MOVED;
  }
  close($logfh);
}


Это сообщение отредактировал(а) heluna - 26.3.2010, 03:42
PM MAIL   Вверх
ginnie
Дата 26.3.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



heluna,  а что скрипт выдает вместо даты? Должен выдавать целое число - unixtime, которое можно перевести в любой удобный вид.
Для получения размера, надо, наверное, написать 
Код

my $kbyte = sprintf("%.2f", stat($filename)->size()/1024);


Это сообщение отредактировал(а) ginnie - 26.3.2010, 16:35


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
heluna
Дата 26.3.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Ок, спасибо за ответы....... не признаёт мой скрипт эту функцию size()...... Замудрила я что-то в своём скрипте, зайду к этой проблеме с другой стороны, попробую переписать скрипт........  :dash1 всем спасибо. Я ещё не раз обращусь к вашей помощи.....))
PM MAIL   Вверх
ginnie
Дата 26.3.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



heluna, не сложно будет показать нам текст сообщения об ошибке про функцию size()?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
heluna
Дата 26.3.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Can´t call method "size" on an undefined value at Programme.pl line 123, <STDIN> line1
 ну вот что-то в этом роде.....
PM MAIL   Вверх
ginnie
Дата 26.3.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



heluna, попробуйте так:

Код

      my $filename=File::Spec->rel2abs($_, $srcdir);
      my $sb = stat($filename);
      my $lastMod = $sb->mtime();
      my $kbyte = sprintf("%.2f", $sb->size()/1024);



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.