otto1699
Goto Top

FTP mit wput nur vorhandene Dateien im Ziel kopieren

Hallo,

ich habe Dateien auf einer Windows Maschine und Dateien auf einer Linux Maschine im gleichen Netzwerk.

Nun möchte ich von Windows per FTP Script nur die vorhandenen Dateien auf Linux ersetzen.

Beispiel:
Windows Verzeichnis
a.pdf
b.pdf
c.pdf
d.pdf
e.pdf

Linux Verzeichnis
b.pdf
d.pdf
e.pdf

Kopiert werden sollen die Dateien b.pdf d.pdf e.pdf

Ist dafür wput richtig?

Wie stelle ich das an?

Gruss Otto

Content-ID: 357570

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

Pedant
Pedant 08.12.2017 um 19:55:50 Uhr
Goto Top
Hallo Otto,

Zitat von @Otto1699:
Nun möchte ich von Windows per FTP Script nur die vorhandenen Dateien auf Linux ersetzen.
Ein allgemeiner Hinweis:
Üblicherweise unterscheidet Linux zwischen Groß-/Klein-Schreibung bei Dateinamen und Windows nicht.

Windows Verzeichnis
Ein_Ordner\b.pdf
Anderer_Ordner2\B.pdf

Linux Verzeichnis
Ein_Ordner1\b.pdf
Ein_Ordner1\B.pdf

Denk mal drüber nach, ob das in Deiner Situation zu Schwierigkeiten führen könnte.

Zitat von @Otto1699:
Wie stelle ich das an?
Ein Weg wäre per Skript ein "dir" des ftp-Verzeichnisses auszuführen und dann dessen Ausgabe filtern, um gezielt die ausgegebenen Dateinamen beim Kopieren von Windows nach Linux zu nutzen.

Zitat von @Otto1699:
Ist dafür wput richtig?
wput kannst Du gut zum Kopieren einsetzen, aber für ein Directorylisting kannst Du es, glaube ich, nicht nutzen.
Vielleich fällt mir dazu noch was ein.

Gruß Frank
Otto1699
Otto1699 08.12.2017 um 20:50:50 Uhr
Goto Top
Hi Frank,

nee, Groß-/Klein-Schreibung bei Dateinamen stellt kein Problem dar.

Man könnte noch überlegen die Sache anders herum zu machen. Also Linux holt sich die Dateien vom Windows Verzeichnis.
Ein Sicherheitsproblem haben wir im gleichen Netz ja nicht.

Gruß Otto
Pedant
Lösung Pedant 08.12.2017 aktualisiert um 21:23:54 Uhr
Goto Top
Hallo Otto,

Zitat von @Pedant:
Vielleich fällt mir dazu noch was ein.
Mit WinSCP könntest Du das Listing erledigen lassen.


Aufruf (WinSCP.com)
winscp.com /script=Skript.txt>Liste.txt
Download https://winscp.net


Skript.txt (Das statische Skript)
option batch on
option confirm off
open ftp://Benutzername:Kennwort@ftp.meinftpserver.de:21 -passive=on
cd /mein_ftp_ordner/
ls
close
exit
Mindestens Zeile 3 und 4 anpassen.


Liste.txt (Beispiel einer erzeugten Ausgabedatei)
batch           on        
reconnecttime   120       
confirm         off       
Connecting to ftp.meinftpserver.de ...
Connected
Starting the session...
Session started.
Active session: [1] Benutzername@ftp.meinftpserver.de
/mein_ftp_ordner
D---------   0                           0              ..
-rw-r--r--   0 1091693  1101          4081 Dec  8 20:15:02 2017 b.pdf
-rw-r--r--   0 1091693  1101          2231 Dec  8 20:15:02 2017 d.pdf
-rw-r--r--   0 1091693  1101          5204 Dec  8 20:15:02 2017 e.pdf
Session 'Benutzername@ftp.meinftpserver.de' closed.  
No session.
Diese Datei kannst Du mit find und for parsen und eine auf Dateinamen reduzierte Datei erzeugen.


Upload.cmd (Das "Master"-Skript)
@echo off
if exist Liste.txt del Liste.txt
if exist Dateinamen.txt del Dateinamen.txt

winscp.com /script=Skript.txt>Liste.txt

for /f "skip=1 tokens=10" %%d in ('find Liste.txt ".pdf"') do (  
	echo %%d>>Dateinamen.txt
)

REM Dateinamen.txt für den Upload nutzen
REM Hier fehlt also noch Code


Dateinamen.txt (Beispiel einer erzeugten Dateiliste)
b.pdf
d.pdf
e.pdf


Falls Deine x.pdf Leerzeichen im tatsächlichen Dateinamen haben sollten, muss zumindest tokens noch angepasst werden.

Falls Du Fragen hast, lass Dich nicht abhalten.

Gruß Frank
Otto1699
Otto1699 09.12.2017 um 11:00:29 Uhr
Goto Top
Hallo Frank,

vielen Dank für die Hilfe.

Ich nutze
open sftp://Benutzername:Kennwort@192.168.0.135 -hostkey=xxxx" 

Falls Deine x.pdf Leerzeichen im tatsächlichen Dateinamen haben sollten, muss zumindest tokens noch angepasst werden.

Ja, Leerzeichen oder mehrere sind in den Dateinamen. Bekomme es mit dem token nicht hin.

Hier meine Liste.txt
batch           on        
confirm         off       
Searching for host...
Connecting to host...
Authenticating...
Using username "Benutzername".  
Authenticating with pre-entered password.
Authenticated.
Starting the session...
Session started.
Active session: [1] Benutzername@192.168.0.135
/tmp
drwx------   2 root     root          4096 Sep  2  9:43:34 2017 vmware-root
drwxrwxrwt   6 root     root          4096 Dec  9 10:39:01 2017 .
-rw-rw-r--   1 www-data www-data     41077 Aug 14 11:35:19 2017 184 G-99992000.pdf
drwxrwxr-x   2 www-data www-data      4096 Oct 25  9:34:28 2017 views_plugin_display
drwxr-xr-x   2 www-data www-data      4096 Nov 21 18:05:05 2017 update-extraction-0cd83a25
-rw-rw-r--   1 www-data www-data     41104 Aug 14 11:35:20 2017 203 G-12342000.pdf
-r--r--r--   1 www-data www-data       675 Sep  3  9:05:10 2017 .htaccess
drwxr-xr-x  23 root     root          4096 Jan 15 16:09:02 2017 ..
drwxr-xr-x   2 www-data www-data      4096 Nov 21 18:05:05 2017 update-cache-0cd83a25
Session 'Benutzername@192.168.0.135' closed.  
No session.

Würdest du mir nochmal helfen.


Gruß Otto
Pedant
Lösung Pedant 09.12.2017 um 14:17:53 Uhr
Goto Top
Hallo Otto,

Zitat von @Otto1699:
Leerzeichen oder mehrere sind in den Dateinamen. Bekomme es mit dem token nicht hin.
Würdest du mir nochmal helfen.

Funktionert Dein Skript soweit, dass
184203
in der Dateinamen.txt ladet, statt
184 G-99992000.pdf203 G-12342000.pdf
?

Die jetzige For-Schleife zerlegt die Ausgabezeilen in Teilstücke (Tokens).
Die Trennung findet bei den Leerzeichen statt, wobei eines oder aufeinanderfolgende gleich behandelt werden.
Jede Zeile hat hier 9 Tokens zzgl. der Dateinamen, die auch in ein oder mehrere Tokens zerlegt werden.
Normalerweise wird der erste Token der angegebenen Variablen (hier %%d) zugeordnet.
Der zweite Token erhält den folgenden Buchstaben, also %%e usw.

Die Angabe tokens=10 weist an, dass nur der 10. Token genutzt werden soll.
Er wird dann der angegebenen Variablen (hier %%d) zugeordnet.

Man kann auch mehrere Token explizit angeben.
tokens=10,11
Das würde hier zu folgender Zuordnung führen:
%%d=203%%e=G-12342000.pdf
Mit %%d %%e könnte man sich dann 203 G-12342000.pdf zusammen basteln.

Das funktioniert aber nur wie gewünscht, wenn der Dateiname lediglich ein Trennstelle enthält und diese nur durch ein einziges Leerzeichen gebildet wird.
203 G-12342000.pdf => %%d=203 und %%e=G-12342000.pdf
%%d %%e => 203 G-12342000.pdf
aber
203   G-12342000.pdf => %%d=203 und %%e=G-12342000.pdf
%%d %%e => 203 G-12342000.pdf
Fehler: 203   G-12342000.pdf != 203 G-12342000.pdf


Beide Schwierigkeiten lassen sich leicht umgehen.
Die Tokenliste sollte so aussehen:
tokens=9,*
Es wird das 9. Token der angegebenen Variabel zugeordnet und * bedeutet, dass der Rest der Zeile (unverändert) genutzt wird, der hier in der nächsten Variablen landet.
Das 9. Token interessiert hier nicht, aber eben der Zeilen Rest, der mit dem 10. Token nicht unbedingt vollständig wäre.

Hier die angepasste For-Schleife
for /f "skip=1 tokens=9,*" %%a in ('find Liste.txt ".pdf"') do (
	echo %%b>>Dateinamen.txt
)
(a und b belegen, aber lediglich b nutzen.)

Gruß Frank
Otto1699
Otto1699 09.12.2017 um 19:04:30 Uhr
Goto Top
Hallo Frank,

danke für die Hilfe, hat alles geklappt.

Deine Hilfe ist ja wie Weihnachten face-smile

Gruß Otto
Pedant
Pedant 10.12.2017 um 14:20:28 Uhr
Goto Top
Hallo Otto,

Zitat von @Otto1699:
Deine Hilfe ist ja wie Weihnachten
Gern geschehen und Du hast jetzt bis Neujahr Zeit, das Skript so zu ändern, dass es ohne die Hilfsdateien auskommt.
(Falls Du Spaß daran haben solltest.)

Gruß Frank