Vorhandene Datei auf Server prüfen

R

RonaldMHofmann

Mitglied
Thread Starter
Dabei seit
03.09.2004
Beiträge
53
Reaktionspunkte
0
Hallo,
ich habe das Problem, dass ich Dateien auf einen Server hochladen muss, die dort noch nicht vorhanden sind. Um mehrfache Uploads der gleichen Datei zu vermeiden, sie verursachen ziemlichen Traffic, möchte ich vor dem Upload prüfen, ob die jeweilige Datei schon auf dem Server ist. Im Moment mache ich das so, dass ich das entfernte FTP Verzeichnis auf meinem Mac mounte, nachsehe ob die Datei drauf ist und dann wieder auswerfe (eject). Leider auch sehr aufwendig und nicht sehr zuverlässig, weil in dem fraglichen Verzeichnis derzeit ca. 8000 Dateien liegen, Tendenz steigend. Ich lade meine Dateien mit curl -T hoch. Weiss jemand ob es etwas anderes gibt das Vorhandensein einer Datei auf einem Server zu prüfen?

TiA, Ronald
 
Was spricht dagegen, ein FTP-Programm zu benutzen, das diese Funktion beherrscht?

CaptainFTP - einfach zu bedienender FTP-Client, Shareware
CuteFTP - kommerzieller FTP-Client
CyberDuck - freier FTP and SFTP Browser
DiskOrder - Shareware Dateimanager mit FTP-Funktionalität
Fetch - FTP & SFTP Client, Shareware
Fugu - SFTP, SCP und SSH Frontend
Interarchy - Shareware FTP-Client
RBrowser - FTP Client, frei oder kommerziell (mit mehr Features)
Transmit - beliebter Shareware FTP-Client
 
Die Teile kenne ich alle. Alerdings sitzt ja keiner da, der das überprüft. Ich habe eine kleine Software geschrieben, die das ganze automatisch erledigt. Es sind pro Tag zwischen 200 und 500 Dateien die verschoben werden sollen. Es wäre sicher nich so toll, das jetzt mit einem eigenen FTP-Programm zu erledigen.
 
Die Aufgabe könntest Du sehr schön mit Perl lösen.
Mit Perl könntest Du die ganze Aktion inklusive des Uploads automatisieren.
Es gibt ein Modul Net::FTP, das dabei besonders helfen kann.

Edit:
Bei curl dürfte Dich der Schalter -l interessieren
 
Dann frage doch in Deinem kleinen Programm ab, ob die Datei schon existiert, vergleiche Datum und Uhrzeit, falls älter, dann kopieren, ansonsten nächste Datei.
 
-> HäckMäc
danke für Deine Mühe. Aber das mache ich ja längst. Wobei das vergleichen der Zeiten völlig irrelevant ist. Es reicht völlig aus zu woissen ob die Datei schon oben ist. Das Problem ist, dass durch die grosse Anzahl der Dateien und dem Mounten im Finder Timingprobleme auftreten.

-> maceis
Den Schalter -l habe ich schon probiert. Der liefert allerdings alle Dateien im Verzeichnis. Bei 8000 Dateien also auch nicht empfehlenswert. Ich hatte an etwas wie getFileInfo (URLString) gedacht. Bekomme ich die Info ist die Datei vorhanden, bekomme ich einen Fehler, dann ist sie noch nicht oben und ich muss sie hochladen. Perl wäre vielleicht interessant, habe ich mich bisher nicht mit auseinandergesetzt.
 
Ich denke auch, dass es einen entsprechenden Befehl für das Terminal gibt. Den habe ich nur noch nicht gefunden ÷((
 
meinst du den Befehl test?

Code:
man test
 
RonaldMHofmann schrieb:
...
Perl wäre vielleicht interessant, habe ich mich bisher nicht mit auseinandergesetzt.
Mit dem Net::perl Modul kannst Du auf relativ einfache Weise einen Client programmieren, der alle Deine Bedürfnisse abdeckt. Interessant dürfte dabei sein, dass Du die Status- und Fehlermeldungen des Servers auswerten kannst, was Dir erlaubt, festzustellen, ob eine Datei auf dem Server vorhanden ist oder nicht.

Insgesamt könnte das Skript so aussehen, dass Du ein Verzeichnis (oder ein Liste von Dateinamen) an das Skript übergibst und für jede enthaltene Datei prüfen lässt, ob diese auf dem Server existiert. Wenn nein -> hochladen + nächste Datei, wenn ja -> nächste Datei.

Als Einstig kann Dir vielleicht das in der Doku zu Net::FTP erwähnte Beispielskript 'autoftp' unter http://www.csh.rit.edu/~adam/Progs/ dienen.
[Edit:]Ich hab mir das gerade selbst mal angesehen. Das Skript ist bestimmt sehr leistungsfähig, aber auch sehr umfangreich und daher für den Einstieg evt. doch nicht so ideal ;).

HTH
 
Zuletzt bearbeitet:
RonaldMHofmann schrieb:
Ich denke auch, dass es einen entsprechenden Befehl für das Terminal gibt.
ncftp fragt standardmäßig, wenn die Datei bereits existiert. Das sollte sich auch irgendwo ändern lassen.
 
Ach so, noch was fällt mir da gerade noch ein.
Das ftp Kommando liest auch aus einer Pipe Befehle, die dann auf dem Server ausgeführt werden.
Das ist besonders hilfreich, wenn man eine entsprechend konfigurierte .netrc Datei hat. Hier mal ein kleines Beispiel:
Code:
% echo ls /pub/INDEX | ftp ftp.uni-stuttgart.de
[color=blue]Connected to ftp.uni-stuttgart.de.
220 ProFTPD 1.2.9 Server (Debian) [infolms]
331 Anonymous login ok, send your complete email address as your password.
...
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
229 Entering Extended Passive Mode (|||64585|)
150 Opening ASCII mode data connection for file list
-rw-rwxr--   1 306      rusbb        1414 Nov 14  1993 /pub/INDEX
226 Transfer complete.
221 Goodbye.[/color]
%

Durch Parsen der Serverantwort (hier blau) kann man dann sehr leicht feststellen, ob die Datei auf dem Server liegt oder nicht. Mit Perl geht es aber trotzdem leichter.
 
Vielleicht verstehe ich das Problem nicht ganz, aber warum curl -T benutzen und mit einem eigenen Programm die Dateiexistenz prüfen? Warum nicht einfach ein Programm wie lftp benutzen, daß komplett ohne Interaktion auskommt und zudem noch gutes mirroring macht, benutzen?

jkm
 
-> jkm
das liegt daran, dass das Hochladen der jpg Datei nur ein Teil des Gesamtrozesses ist der von meiner Software erledigt wird. Der funktioniert auch gut bis eben auf die manchmal auftretende Unzuverlässigkeit wenn viele Dateien im entfernten Verzeichnis liegen. lftp? kenne ich nicht. Wo gibt es das?
 
RonaldMHofmann schrieb:
das liegt daran, dass das Hochladen der jpg Datei nur ein Teil des Gesamtrozesses ist der von meiner Software erledigt wird.
Und was spricht dagegen, aus Deiner Software heraus ein ncftp/lftp/you name it aufzurufen?
 
@dpr: Genau das meine ich ja auch.

@RonaldMHofmann: Gleich das erste Ergebnis bei Google: http://lftp.yar.ru/
Mußt es auf dem Mac aber selbst kompilieren – geht aber, habe ich schon getestet.
 
Direkt dagegen spricht eigentlich nichts. Nur verwendet lftp vermutlich auch nichts anderes als einen passenden Terminal Befehl. Ich persönlich finde es besser diese Geschichten zu kennen und zu nutzen als blind darauf zu vertrauen dass es in einer anderen Software schon funktionieren wird. Was ist, wenn lftp aus irgendeinem Grunde nicht das macht was ich erwarte? Dann habe ich ein Problem. Vertrauen ist gut, Kontrolle ist besser :)
 
RonaldMHofmann schrieb:
Nur verwendet lftp vermutlich auch nichts anderes als einen passenden Terminal Befehl.
Nö, sieht man aber auch, wenn man sich lftp mal diagonal ansieht.

Was ist, wenn lftp aus irgendeinem Grunde nicht das macht was ich erwarte?
Dann heißt es wie immer: "Use the source, Luke".

Nur der Vollständigkeit halber: Du kannst es Dir gerne so kompliziert machen, wie Du möchtest; Du wirst schon Gründe haben, warum Du vorhandenen Code neu implementieren willst.
 
@Ronald

wenn Du unbedingt mit bereits vorhandenen Shellkommandos arbeiten möchtest, was spricht dann gegen den in #12 geposteten Vorschlag?
 
RonaldMHofmann schrieb:
Direkt dagegen spricht eigentlich nichts. Nur verwendet lftp vermutlich auch nichts anderes als einen passenden Terminal Befehl. Ich persönlich finde es besser diese Geschichten zu kennen und zu nutzen als blind darauf zu vertrauen dass es in einer anderen Software schon funktionieren wird. Was ist, wenn lftp aus irgendeinem Grunde nicht das macht was ich erwarte? Dann habe ich ein Problem. Vertrauen ist gut, Kontrolle ist besser :)

Wenn man genug Zeit hat, kann man natürlich nur OpenSource verwenden, immer den Quellcode checken oder besser noch, alle Software selbst schreiben. Aber dann ist man in der Regel schon so weit fortgeschritten, daß man bei MacUser keine Unix-Fragen mehr stellen muß, dann ist man nämlich schon ein Guru. Und verwendet auch kein MacOS mehr.

Nimm das aber nicht so ernst ;-)
 
Zurück
Oben Unten