Thread ftp datenvergleich mit anderen ftp (10 answers)
Opened by Gustl at 2011-04-12 23:00

rosti
 2011-04-13 09:09
#147673 #147673
User since
2011-03-19
3194 Artikel
BenutzerIn
[Homepage]
user image
Es ist überarbeitungsbedüftig und ich tus mal hier rein als opensource ;)
Tipp: Mach FTP für alles im binary mode. Die mtime zu ermitteln ist kein Problem.
Code (perl): (dl )
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
#!/usr/bin/perl

#
# Rolf Rost, 6.4.2002
# Download eines kompletten Webtrees via FTP
# Alle Verzeichnisse und Dateien werden remote eingelesen und lokal
# gespiegelt
#
########### Benutzervorgaben ##############################################
# Lokales Downloadverzeichnis, no trailing Slash (am Ende kein Slash)
$ldir = "/tmp";

# Endungen der Files fuer ascii-mode (mit Punkt und mit "|" getrennt)
# einfache Hochkomma
$asc = '.htm|.html|.css|.pl|.cgi|.txt|.htaccess|.log|.ini';

# Benutzername, Passwort und Hostname (oder IP-Nummer) für den FTP Zugang
$ftp_id = "***";                                # Benutzername
$ftp_pw = "***";                                # Passwort
$ftp_host = "i-netlab.de";                      # FTP HostName (IP oder Name)

################## Ende der Benutzervorgaben ##############################
use File::Basename;
use File::Path;
use Net::FTP;

$|=1;

# Verbindung zum FTP Host herstellen und einloggen
        $ftp = Net::FTP->new($ftp_host) or die "Keine Verbindung\n";
        $ftp->login($ftp_id, $ftp_pw) or die "Anmeldung fehlgeschlagen\n";

# Remote Files auf eine Liste lesen ab einem best. Verzeichnis
        @rfiles = ();
        traverse("/htdocs");
        
# Remote Files downloaden, dazu ggf. Verzeichnisse lokal anlegen        
        &download;

exit;
################### Subfunctions ##########################################
# anhand der RemoteFile Liste FTP Donwload
sub download{
        foreach my $rfile(@rfiles){
                # den oder die slashes am Anfang entfernen
                $rfile =~ s/^\/+//;
                #print "$rfile\n";
                my ($name, $path) = fileparse($rfile);
                # lokal chdir oder mkdir + chdir
                $xdir = "$ldir/$path";
                chdir $xdir or mkpath($xdir);  
                chdir $xdir;
                                
                print "FTP $name -> $ldir/$path$name\n";
                # und nun das Download via FTP
                # Uebertragungsmode
                if( $name =~ /$asc$/ ){ $ftp->ascii }
                else{ $ftp->binary }
                $ftp->cwd("/$path");
                $ftp->get($name);
        }
        $ftp->quit();
}


# Remote via FTP den Tree traversieren und Files einlesen
sub traverse {
        my $dir = shift;
        unless (rdir($dir)) {
                warn "Can't read $dir via FTP\n";
                return;
        }
        for (rdir($dir)) {
                @line = split /\s+/,$_;   # $line[0] $line[8]
                next if  /^\./;
                if ( /^d/ and !/^l/ ) {
                        #print "$dir/$line[8]\n";
                        traverse("$dir/$line[8]");
                }
                else {
                        #print "$dir/$line[8]\n";
                        push @rfiles, "$dir/$line[8]";
                }
        }
}

# RemoteDir einlesen und array zurueckgeben
sub rdir{
        my $dir = shift;
        $ftp->cwd($dir);
        $rdir = $ftp->dir();
        return @$rdir;
}

View full thread ftp datenvergleich mit anderen ftp