Thread ftp datenvergleich mit anderen ftp
(10 answers)
Opened by Gustl at 2011-04-12 23:00
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; } |