Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Синхронизация каталогов по FTP / 10 сообщений из 10, страница 1 из 1
29.12.2004, 18:13
    #32850466
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Есть ли у кого пример скрипта по теме - сабж
...
Рейтинг: 0 / 0
30.12.2004, 11:27
    #32851137
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Николай_Есть ли у кого пример скрипта по теме - сабж

на чем пишешь хоть? :)
...
Рейтинг: 0 / 0
30.12.2004, 12:29
    #32851310
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
PHP
...
Рейтинг: 0 / 0
30.12.2004, 12:29
    #32851311
Макс М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Линкольн Д. Штайн "Разработка сетевых программ на PERL". стр. 156
Глава "Сценарий создания зеркального отображения каталога"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
#!/usr/bin/perl -w
# file: ftp_mirror.pl
# Figure  6 . 2 : Recursively mirroring an FTP directory

use strict;
use Net::FTP;
use File::Path;
use Getopt::Long;

use constant USAGEMSG => <<USAGE;
Usage: ftp_mirror.pl [options] host:/path/to/directory
Options: 
        --user  <user>  Login name
        --pass  <pass>  Password
        --hash          Progress reports
        --verbose       Verbose messages
USAGE

my ($USERNAME,$PASS,$VERBOSE,$HASH);

die USAGEMSG unless GetOptions('user=s'  => \$USERNAME,
                               'pass=s'  => \$PASS,
                               'hash'    => \$HASH,
                               'verbose' => \$VERBOSE);
die USAGEMSG unless my ($HOST,$PATH) = $ARGV[ 0 ]=~/(.+):(.+)/;

my $ftp = Net::FTP->new($HOST) or die "Can't connect: $@\n";
$ftp->login($USERNAME,$PASS)   or die "Can't login: ",$ftp->message;
$ftp->binary;
$ftp->hash( 1 ) if $HASH;

do_mirror($PATH);

$ftp->quit;
exit  0 ;

# top-level entry point for mirroring.
sub do_mirror {
  my $path = shift;

  return unless my $type = find_type($path);

  my ($prefix,$leaf) = $path =~ m!^(.*?)([^/]+)/?$!;
  $ftp->cwd($prefix) if $prefix;

  return get_file($leaf)  if $type eq '-';  # ordinary file
  return get_dir($leaf)   if $type eq 'd';  # directory

  warn "Don't know what to do with a file of type $type. Skipping.";
}

# mirror a file
sub get_file {
  my ($path,$mode) = @_;
  my $rtime = $ftp->mdtm($path);
  my $rsize = $ftp->size($path);
  $mode = (parse_listing($ftp->dir($path)))[2] unless defined $mode;

  my ($lsize,$ltime) = stat($path) ? (stat(_))[7,9] : (0,0);
  if ( defined($rtime) and defined($rsize) 
       and ($ltime >= $rtime) 
       and ($lsize == $rsize) ) {
    warn "Getting file $path: not newer than local copy.\n" if $VERBOSE;
    return;
  }

  warn "Getting file $path\n" if $VERBOSE;
  $ftp->get($path) or (warn $ftp->message,"\n" and return);
  chmod $mode,$path if $mode;
}

# mirror a directory, recursively
sub get_dir {
  my ($path,$mode) = @_;
  my $localpath = $path;
  -d $localpath or mkpath $localpath or die "mkpath failed: $!";
  chdir $localpath                   or die "can't chdir to $localpath: $!";
  chmod $mode,'.' if $mode;

  my $cwd = $ftp->pwd                or die "can't pwd: ",$ftp->message;
  $ftp->cwd($path)                   or die "can't cwd: ",$ftp->message;

  warn "Getting directory $path/\n" if $VERBOSE;

  foreach ($ftp->dir) {
    next unless my ($type,$name,$mode) = parse_listing($_);
    next if $name =~ /^(\.|\.\.)$/;  # skip . and ..
    get_dir ($name,$mode)    if $type eq 'd';
    get_file($name,$mode)    if $type eq '-';
    make_link($name)         if $type eq 'l';
  }

  $ftp->cwd($cwd)     or die "can't cwd: ",$ftp->message;
  chdir '..';
}

# subroutine to determine whether a path is a directory or a file
sub find_type {
  my $path = shift;
  my $pwd = $ftp->pwd;
  my $type = '-';  # assume plain file
  if ($ftp->cwd($path)) {
    $ftp->cwd($pwd);
    $type = 'd';
  }
  return $type;
}

# Attempt to mirror a link.  Only works on relative targets.
sub make_link {
  my $entry = shift;
  my ($link,$target) = split /\s+->\s+/,$entry;
  return if $target =~ m!^/!;
  warn "Symlinking $link -> $target\n" if $VERBOSE;
  return symlink $target,$link;
}

# parse directory listings 
# -rw-r--r--   1 root     root          312 Aug  1  1994 welcome.msg
sub parse_listing {
  my $listing = shift;
  return unless my ($type,$mode,$name) =
    $listing =~ /^([a-z-])([a-z-]{ 9 })  # -rw-r--r--
                 \s+\d*                #  1 
                 (?:\s+\w+){ 2 }         # root root
                 \s+\d+                #  312 
                 \s+\w+\s+\d+\s+[\d:]+ # Aug  1   1994 
                 \s+(.+)               # welcome.msg
                 $/x;           
  return ($type,$name,filemode($mode));
}

# turn symbolic modes into octal
sub filemode {
  my $symbolic = shift;
  my (@modes) = $symbolic =~ /(...)(...)(...)$/g;
  my $result;
  my $multiplier =  1 ;
  while (my $mode = pop @modes) {
    my $m =  0 ;
    $m +=  1  if $mode =~ /[xsS]/;
    $m +=  2  if $mode =~ /w/;
    $m +=  4  if $mode =~ /r/;
    $result += $m * $multiplier if $m >  0 ;
    $multiplier *=  8 ;
  }
  $result;
}
взято с http://modperl.com:9000/perl_networking/source/ch6/ftp_mirror.pl
...
Рейтинг: 0 / 0
30.12.2004, 12:30
    #32851315
Макс М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
не видел твоего последнего ответа :(
...
Рейтинг: 0 / 0
30.12.2004, 12:37
    #32851334
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Вот бы такое же , но на PHP :)
...
Рейтинг: 0 / 0
30.12.2004, 12:47
    #32851358
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Николай_Вот бы такое же , но на PHP :)

в этом примере показан смысл работы, я думаю можно его переписать на PHP
...
Рейтинг: 0 / 0
30.12.2004, 12:53
    #32851378
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
Николай aka Motodorя думаю можно его переписать на PHP FTP . Только человек похоже пришёл за готовым решением, иначе давно бы нашёл этот раздел в мануале самостоятельно.
...
Рейтинг: 0 / 0
30.12.2004, 12:56
    #32851388
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
* Николай aka Motodorя думаю можно его переписать на PHP FTP . Только человек похоже пришёл за готовым решением, иначе давно бы нашёл этот раздел в мануале самостоятельно.

да похоже на то ...
...
Рейтинг: 0 / 0
30.12.2004, 13:00
    #32851395
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация каталогов по FTP
* Николай aka Motodorя думаю можно его переписать на PHP FTP . Только человек похоже пришёл за готовым решением, иначе давно бы нашёл этот раздел в мануале самостоятельно.
Тут я был... Там примеры хорошие, но они для резервного копирования файлов по FTP... Вот на примеры и пишу код для синхронизации...
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Синхронизация каталогов по FTP / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]