micha-80
Goto Top

Verzeichnis mit 1 Mio Dateien per FTP kopieren - Wie?!

Hallo liebe Community,

ich suche nun schon seit einigen Tagen nach einer Lösung für mein Problem, bin jedoch immer wieder gescheitert. Nun wende mich hilfesuchend an all die Linux Profis. Ich hoffe, Ihr könnt mir helfen.

Folgendes Problem:

Ich muss ein Webprojekt von Server A zu Server B umziehen. Server A erlaubt mir einen Zugang ausschließlich per FTP (kein SCP, kein SSH, kein rsync, alles schon angefragt). Dieses Projekt hat ein Datenvolumen von ca. 300 GB. Das Kopieren funktioniert per FTP soweit auch ganz gut, bis auf ein Verzeichnis, was sich strikt weigert, korrekt kopiert zu werden.

Wenn ich das Projekt kopiere, dann kopiert er etwa 150 GB an Daten problemlos und beendet dann den Transfer ohne Fehlermeldung. Mir fehlen dann aber noch ca. 150 GB an Daten. Bei diesen Daten handelt es sich um ca. 1.000.000 Dateien, die durch den Vorgänger allesamt in ein einziges Verzeichnis abgelegt wurden. Von diesen 150GB werden mir per FTP gerade einmal 100.000 Dateien mit ca. 15 GB kopiert. Der Rest wird schlichtweg nicht mit kopiert. Ich habe keine Ahnung warum.

Folgende Kopiermöglichkeiten habe ich bereits probiert:

curlftpfs & rsync: teilweise problembehaftet, obiges Ergebnis
FTP mit mget *: obiges Ergebnis
FTP: bin nochmal per FTP jeden anfangsbuchstaben in dem ordner durchgegangen, also mget a*, mget b*, mget c*, etc. dasselbe ergebnis wie mget *
lftp mit mirror bei 5 parallelverbindungen: sehr schnell, obiges Ergebnis
ncftp mit bgget: sehr langsam, bislang nur obiges Ergebnis

Die Dateien sind auf Server A aber definitiv vorhanden, denn ich kann das Webprojekt live sehen, dort sind alle Dateien abrufbar, während bei meiner Kopie auf Server B tausende Dateien als fehlend angezeigt werden.

Fällt Euch dazu irgendwas ein? Irgendjemand noch eine Idee, was ich noch probieren könnte? Ich habe das ganze Netz durchforstet und bislang keinen ähnlichen Fall gefunden. Vielleicht habe ich aber auch nur die falschen Suchbegriffe eingegeben. Wäre Euch wirklich dankbar, weil ich mit meinem Latein echt am Ende bin.


Vielen Dank!

Micha

Content-Key: 132181

Url: https://administrator.de/contentid/132181

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: photographix
photographix 23.12.2009 um 07:00:00 Uhr
Goto Top
Olá Micha-80

das Problem kommt mir bekannt vor. Nur das es bei uns 1,8 Millionen Dateien waren dafür aber "nur" 100GB.
Bei meinem Fall hat einfach das DirectoryListing zu lange gedauert. Allein 1,10 Stunden!! hat der Server gebraucht um mir das Listing zu schicken! Was sich nach 2 Sekunden aufgrund von Änderungen (wir haben den FTP Server noch benutzt, wieder neu eingelesen wurde... Narf) Zumindest mit Windows Boardmitteln und den üblichen FTP Clients kam ich nicht ran.

Rsync kann kein FTP sprechen außer über Curlftpfs.
Das würde ich dir auch nochmal ans Herz legen. Mach nebenbei noch ein Terminal auf indem du Curlftpfs im Debugmodus laufen lässt

curlftpfs ftp://dein-ftp-user:dein-pw@dein-ftp /verzeichnis-wohin-mounten -d -o -v

während du im anderen Terminal mit Rsync über Curlftpfs ziehst.
Ich konnte dann bei mir sehen. Das genau nach 15min die Verbindung von der Gegenseite gekappt wurde auf Grund von "Nichtstun" ich las ja noch das Listing ein...

Wir haben dann mit dem Provider geredet 1u1 und dieser hat uns zwei Dinge vorgeschlagen a) er zippt uns den ganzen Berg und stellt ihn uns als FTP download zur Verfügung (Vorteil: nur eine Datei, kein Listing, Nachteil: riesengroß, dauert unendlich lange zum download) b) er hat uns für einige STunden einen ssh Zugang gegeben. Sodass wir ganz fix mit Rsync ziehen konnten. Ich empfehle dir auch mit dem Betreiber des FTP's zu reden. Ev findet IHr ja eine schnellere Lösung.

Wenn das nicht geht bleibe bei Curlftpfs und debugge die übertragung - so weisst du warum der Download nicht geht und kannst dann dort ansetzen.
Mitglied: StefanKittel
StefanKittel 23.12.2009 um 08:09:56 Uhr
Goto Top
Zitat von @photographix:er zippt uns den ganzen Berg und stellt ihn uns als FTP download zur Verfügung (Vorteil: nur eine Datei, kein Listing, Nachteil: riesengroß, dauert unendlich lange zum download)
Die ZIP Datei müßte doch deutlich kleiner als die Summe der einzelnden Dateien sein.

Viele Provider bieten die Möglichkeit, auch 1und1, über das WebFrontEnd Verzeichnisse und Dateien zu packen und entpacken.
Dies sollte die einfachste Möglichkeit sein.

Alternative:
Liste mit den Dateinamen erstellen und eine Batchdatei mit get/mget erstellen. Dann kann man "einfach" immer dort weitermachen wo er aufgehört hat ohne das Listing neu einzulesen.

Stefan
Mitglied: DrAlcome
DrAlcome 23.12.2009 um 09:31:15 Uhr
Goto Top
Zitat von @StefanKittel:
> Zitat von @photographix:er zippt uns den ganzen Berg und stellt ihn uns als FTP download zur Verfügung (Vorteil: nur
eine Datei, kein Listing, Nachteil: riesengroß, dauert unendlich lange zum download)
Die ZIP Datei müßte doch deutlich kleiner als die Summe der einzelnden Dateien sein.
Kommt ja auf die Dateien an, die dort im Verzeichnis liegen. Wenn die größtenteils schon in einem komprimierten Dateiformat vorliegen (JPG oder so), wird die ZIP-Datei nicht viel kleiner werden. Der Vorteil wäre in dem Fall nur der eingesparte Overhead und Verzeichnisindex.
Mitglied: Micha-80
Micha-80 23.12.2009 um 10:56:16 Uhr
Goto Top
Hey Männer,

vielen Dank für Eure Vorschläge. Werde den Versuch mir curlftpfs noch einmal starten mit dem Debug Modus wie von Photographix vorgeschlagen.

Es handelt sich übrigens wirklich um jpg Bilder, sodass eine Kompression keine Platzersparnis bringen würde. Dem Nachteil mit der Riesendatei könnte man ja mit Splitting des Archives entgegenwirken. Ich hatte auch schon daran gedacht, den Gedanken dann allerdings verworfen, weil auf dem Zielserver zu wenig Speicherplatz zur Verfügung steht, um ein solch großes Archiv anzulegen.

Wenn alles andere nicht klappt, werde ich wohl selbst mal mit dem Hoster des Projektvorgängers reden müssen. Habe schon mehrfach den Vorgänger gebeten, seinen Hoster zur Freigabe von SCP, rsync, ssh zu bewegen (es ist ein managed server), schon allein, weil ich FTP Transfers für viel zu unsicher halte. Bislang ist der Hoster jedoch auf nichts dergleichen eingegangen.

Viele Grüße und schon einmal Danke für Eure zahlreichen Hilfestellungen face-smile

Micha
Mitglied: manuel-r
manuel-r 23.12.2009 um 11:02:30 Uhr
Goto Top
Ich würde mir ein Listing der Verzeichnisse und Dateien besorgen (als Textdatei). Mit dieser Datei dann per Batch wget oder ftp füttern und jede Datei einzeln vom Server holen. Dann noch mitschreiben, welche Datei wann geholt wurde und ob der Vorgang erfolgreich war. Das dauert zwar eine Weile, aber da der Server jede Datei einzeln ausliefert sollte das funktionieren. Mit Hilfe der Logdatei am Ende quer prüfen, ob alle Dateien heruntergeladen wurden und mit Hilfe eines neuen Verzeichnislistings ob sich Dateien während/nach dem Download geändert haben.

Manuel
Mitglied: dog
dog 23.12.2009 um 15:04:36 Uhr
Goto Top
Wenn die Dateien in einem Webserver-lesbaren Verzeichnis liegen würde ich auch so vorgehen:

Ein kleines PHP script ala
$dir = glob('*');  
foreach($dir as $file)
	echo 'http://example.com/'.$file."\n";  

Und die Datei kann man direkt in wget füttern.

Grüße

Max
Mitglied: Micha-80
Micha-80 23.12.2009 um 19:25:49 Uhr
Goto Top
Also Curlftpfs hat erneut nicht geklappt. Allerdings bin ich nun an ein DirectoryListing des Quellverzeichnisses gekommen. Ich habe diese Liste bereits bereinigt, sodass nur noch absolute Pfade je Zeile stehen. Nun stehe ich irgendwie auf dem Schlauch: wie lasse ich diese Liste mit 1 Mio Zeilen per FTP am besten abarbeiten? Hat jemand da irgendeinen Code-Schnipsel oder Link für mich? Finde dazu spontan kein Script im Netz.

Vielen Dank face-smile

Micha
Mitglied: dog
dog 23.12.2009 um 20:52:31 Uhr
Goto Top
$man wget

       -i file
       --input-file=file
           Read URLs from file.  If - is specified as file, URLs are read from
           the standard input.  (Use ./- to read from a file literally named
           -.)

           If this function is used, no URLs need be present on the command
           line.  If there are URLs both on the command line and in an input
           file, those on the command lines will be the first ones to be
           retrieved.  The file need not be an HTML document (but no harm if
           it is)---it is enough if the URLs are just listed sequentially.
Mitglied: Micha-80
Micha-80 23.12.2009 um 21:18:21 Uhr
Goto Top
hey, wow, manchmal liegt die lösung so nah, dass man gar nicht drauf kommt. Werde es direkt mal so probieren! Vielen Dank!!
Mitglied: Micha-80
Micha-80 24.12.2009 um 12:40:48 Uhr
Goto Top
Ok, so scheint es zu klappen, auch wenn es nicht der schnellste Weg ist face-wink

Falls jemand einmal ein ähnliches Problem hat, folgendes hat bei mir geklappt:

1.) Directory Listing besorgen oder aber z.B. per FlashFXP (hat bei mir funktioniert) eine Warteschlange erstellen. Das dauert zwar etwas, ging jedoch bei mir nur so. Diese Warteschlange kann man als Datei lokal auf seinem Rechner speichern.

2.) Warteschlangendatei entweder per Shell oder lokal per Notepad++ bereinigen, sodass am Ende nur noch pro Zeile ein einziger Pfad zu einer Datei steht. Darauf achten, dass in der FlashFXP Warteschlange jede Datei zweimal aufgeführt ist, einmal mit Quellpfad, einmal mit Zielpfad. Am besten lässt sich das mit Suchen&Ersetzen per regulärer Ausdrücke bereinigen.

3.) Die bereinigte Dateiliste als Textdatei speichern, zippen, auf den Zielserver kopieren, dort entzippen (das zippen dient nur zum schnelleren übertragen).

4.) Je nachdem, wieviele Wget Verbindungen man parallel nutzen möchte/kann/darf, kann man die Textdatei per Kommandozeile splitten, sodass jeder Wget Befehl einen Teil der Liste abarbeitet. Der Befehl dafür lautet:

split -l 400000 warteschlange.txt

Wobei 400000 die Anzahl an Zeilen ist, die ich pro Datei haben wollte. Die Splits heißen dann xaa, xab, xac, usw.

5.) Nun kann man mehrere Wgets parallel mit eigenen Dateilisten arbeiten lassen (vorher darauf achten, dass man sich im Zielverzeichnis befindet. Ich habe dann folgenden Befehl benutzt:

wget -b -nc --no-verbose -i /Pfad/zur/Datei/xaa --base=ftp://quellserver.com/Pfad/zum/Quellverzeichnis/
wget -b -nc --no-verbose -i /Pfad/zur/Datei/xab --base=ftp://quellserver.com/Pfad/zum/Quellverzeichnis/
wget -b -nc --no-verbose -i /Pfad/zur/Datei/xac --base=ftp://quellserver.com/Pfad/zum/Quellverzeichnis/

Das ganze wird dann im Hintergrund ausgeführt. Man kann, wenn man möchte, die Logdateien mit tail -f verfolgen. Die --base Option habe ich bei mir mit hineingekommen, da ich den /Pfad/zum/Quellverzeichnis/ aus meinen Warteschlangendateien auch noch bereinigt hatte.


Viele Grüße

Micha
Mitglied: 16568
16568 28.12.2009 um 18:02:55 Uhr
Goto Top
Manchmal hilft auch der gute alte Midnight Commander...


Lonesome Walker