PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mit Bash Script per FTP mehrere dateien



martin11411
02-07-2008, 21:04
Hallo,

ich möchte mit einem Bash Shell Script per ftp
viele (immer verschiedene) Dateien aus einem Verzeichnis (ohne unterverzeichnisse) kopieren.
Dabei sollten bereits vorhandene ignoriert werden.

Kann aber nicht muss ist, dass lokale dateien, die nicht mehr im remote Verzeichnis existieren gelöscht werden.

eine synchronisation, wenn man so will.

Danke schon mal

jan61
03-07-2008, 18:55
Moin,

das geht z. B. mit mehreren ftp-Aufrufen und der Nutzung sog. HERE-Dokumente (siehe man bash). Grundsätzlicher Ablauf:

1. Hole Dir eine Liste der Dateien im lokalen Verzeichnis
2. Hole Dir eine Liste der Dateien auf dem FTP-Server
3. Bilde die gewünschten Differenzdateien
4. Baue aus den Differenzdateien ftp-Kommandodateien
5. Führe die Kommandodateien aus.

Beispielsweise so (ungetestet, ohne irgendwelche Fehlerprüfungen - also nur als Gerüst):


# lokale Dateiliste aufbauen
cd LokalesVerzeichnis
ls >/tmp/lokal.txt
# per ftp remote Dateiliste holen
ftp ftp://user:pass@host <<!
cd RemoteDir
ls . /tmp/remote.txt
quit
!
# alle nur remote vorhandenen Dateien mit "delete" in Kommandofile
comm -13 /tmp/lokal.txt /tmp/remote.txt | sed 's/^/delete /' >/tmp/ftp_cmd.txt
# alle nur lokal vorhandenen Dateien mit "put" in Kommandofile
comm -23 /tmp/lokal.txt /tmp/remote.txt | sed 's/^/put /' >>/tmp/ftp_cmd.txt
# Kommandofile per ftp ausführen
ftp ftp://user:pass@host <<!
cd RemoteDir
`cat /tmp/ftp_cmd.txt`
quit
!
Die HERE-Dokumente sind die Zeilen zwischen "...<<!" und "!". Schau Dir an, was die einzelnen Kommandos machen, lies die zugehörigen man-Pages.

Jan

EDIT: Ich habe gerade aus Deinem vorletzten Satz gelesen, dass es genau anders rum laufen soll. Dann besser folgendes Gerüst:


# lokale Dateiliste aufbauen
cd LokalesVerzeichnis
ls >/tmp/lokal.txt
# per ftp remote Dateiliste holen
ftp ftp://user:pass@host <<!
cd RemoteDir
ls . /tmp/remote.txt
quit
!
# alle nur remote vorhandenen Dateien mit "get" in Kommandofile
comm -13 /tmp/lokal.txt /tmp/remote.txt | sed 's/^/get /' >/tmp/ftp_cmd.txt
# alle nur lokal vorhandenen Dateien loeschen
comm -23 /tmp/lokal.txt /tmp/remote.txt | xargs rm
# Kommandofile per ftp ausführen
ftp ftp://user:pass@host <<!
cd RemoteDir
`cat /tmp/ftp_cmd.txt`
quit
!