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


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

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

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;
}

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

Код

#!/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";


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

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

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

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

Автор: krypt3r 25.3.2010, 07:25
Код

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

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

В переменной $path будет переданное из командной строки значение (параметр), которое можно использовать далее в скрипте. Кроме этого, есть модули Getopt::Std и Getopt::Long.

Автор: RomanCh 25.3.2010, 23:00
Цитата(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 Администратор

Можно хотя бы узнать что "не идёт" в моём примере? Я в растерянности, мои способности к телепатии исчерпаны.

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

Можно следующий вопрос.....
проверяя эту директорию, я пробегаю все находящиеся там даты, и все даты старше года я переношу в другую папку 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);
}

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

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

Автор: heluna 26.3.2010, 18:22
Ок, спасибо за ответы....... не признаёт мой скрипт эту функцию size()...... Замудрила я что-то в своём скрипте, зайду к этой проблеме с другой стороны, попробую переписать скрипт........  :dash1 всем спасибо. Я ещё не раз обращусь к вашей помощи.....))

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

Автор: heluna 26.3.2010, 18:41
Can´t call method "size" on an undefined value at Programme.pl line 123, <STDIN> line1
 ну вот что-то в этом роде.....

Автор: ginnie 26.3.2010, 18:47
heluna, попробуйте так:

Код

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

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