highpriest
Goto Top

CURL mehrere Dateien vom ftp-Server herunterladen

Hallo Experten,

ich suche schon lange nach einer Lösung um mit "curl" mehrere Dateien von einem ftp-Server downloaden.
Befor der Vorschlag mit "wget" kommt, es soll wirklich "curl" sein.

Mein Problem ist, dass die Dateienamen kein richtiges System haben, also die haben eine kryptische Bezeichnung, so dass ich mit Platzhaltern nicht arbeiten kann.
Beispiel: 0c442e00-f503-43c8-96c0-36bb7bb7f08e.ics, 0fc54002-7950-4513-9e33-764eefc7cdaf.ics, 1a266732-0000-47ff-a68a-99eb6017e4c6.ics usw.

Mit "curl -o file.txt ftp://user:pw@ftp-server/ordner/" bekomme ich höchstens eine Textdatei/Liste mit Ordnerinhalt.
Kann ich die Datei vielleich dafür irgendwie verwenden, um die Ordnerinhalt zu kopieren oder gibt es eine andere Möglichkeit, wie bei "wget" die Dateien rekursiv herunterzuladen?

Für jeden Tipp wäre ich sehr dankbar!

Gruß

highpriest

Content-Key: 317443

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

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 131026
131026 Oct 11, 2016 updated at 11:17:47 (UTC)
Goto Top
Member: highpriest
highpriest Oct 11, 2016 at 16:27:02 (UTC)
Goto Top
Die Suche habe ich vorher natürlich benutzt, aber leider keine Lösung für mich gefunden.
Ach ja und es muss alles unter Linux funktionieren.
Ich habe jetzt die Frage in den richtigen Bereich verschoben.
Mitglied: 131026
131026 Oct 11, 2016 updated at 16:30:13 (UTC)
Goto Top
Member: mbrinkmann
mbrinkmann Oct 12, 2016 at 09:42:34 (UTC)
Goto Top
Hey highpriest,

diese Schleife nutze ich produktiv.
Denke als Denkansatz hilft es.
Es ist eine For-Schleife für mehrere Server und ein Download mehrerer Dateien per curl.

# Initialisieren der Arrays
array_country=([1]=DE....[...])
array_ip=([1]=192.168........[...])

# Backup der Anlagen in den Arrays
for i in {1..9}
do
curl -s -S -u %USER%:%PASSWORD% -o /mnt/pas01/zip/backup/Telefonanlagen/${array_country[$i]}/voice/vm/mbox#1/greeting#2.wav  ftp://${array_ip[$i]}//ftl0/voice/vm/mbox[1-61]/greeting[1-3].wav --create-dirs --ftp-method nocwd 2>/dev/null
curl -s -S -u %USER%:%PASSWORD% -o /mnt/pas01/zip/backup/Telefonanlagen/${array_country[$i]}/voice/vm/greet/used.greeting_#1.wav  ftp://${array_ip[$i]}//ftl0/voice/vm/greet/used.greeting_[1-3].wav --create-dirs --ftp-method nocwd 2>/dev/null
curl -s -S -u %USER%:%PASSWORD% -o /mnt/pas01/zip/backup/Telefonanlagen/${array_country[$i]}/voice/vm/music/used.moh.wav  ftp://${array_ip[$i]}//ftl0/voice/music/used.moh.wav --create-dirs --ftp-method nocwd 2>/dev/null
done

Grüße Marc
Mitglied: 131026
131026 Oct 12, 2016 updated at 10:06:03 (UTC)
Goto Top
Natürlich kann man das auch per Skript machen, aber effektiv und schnell ist was anderes da dann für jedes einzelne File und Ordner die FTP-Verbindung neu aufgebaut werden muss. Super langsam also.

Folgendes Skript lädt ein Verzeichnis rekursiv herunter:
#!/bin/bash
USERNAME="USERXYZ"  
PASSWORD="GEHEIM"  
# use backslash at end
REMOTEDIR="/remote/dir/"  
LOCALDIR="./download"  
FTPHOST="ftp.host.de"  
# -------
URL="ftp://${USERNAME}:${PASSWORD}@${FTPHOST}"  
GetDirs(){
	subdir="$1"  
	dirs=$(curl -s "${URL}${subdir}" | awk  '{if ($1 ~ /^d/ && $9 !~ /^..?$/){print $9}}')  
	[[ $dirs ]] && echo "$dirs"  
}
GetFiles(){
	subdir="$1"  
	files=$(curl -s "${URL}${subdir}" | awk  '{if ($1 ~ /^-/){print $9}}')  
	[[ $files ]] && echo "$files"  
}
DownloadRecursive(){
	mkdir "$LOCALDIR$1" 2>/dev/null  
	for f in $(GetFiles "$1") ;do  
		echo -e "Downloading file: $1$f\n"  
		curl -o "$LOCALDIR$1$f" "$URL$1$f"  
	done

	for d in $(GetDirs "$1") ;do  
		DownloadRecursive "$1$d/"  
	done
}
DownloadRecursive "$REMOTEDIR"  
R.
Member: highpriest
highpriest Oct 12, 2016 at 17:58:32 (UTC)
Goto Top
Sieht beides vielversprechend aus!
Ich werde es testen und berichten, allerdings werde ich erst am Wochenende Zeit dazu haben.
Ich danke erstmal euch beiden dafür!
Member: highpriest
highpriest Oct 15, 2016 at 22:33:02 (UTC)
Goto Top
@131026
Dein Script funktioniert ganz gut, aber leider nur mit einer Datei.
Irgendwie will die Schleife doch nicht so richtig.
Beispiel:
Wenn nur eine Datei "aaa.txt" im Ordner liegt funktioniert es.
Lege ich eine zweite Datei "bbb.txt" im Ordner an, bekomme ich Fehlermeldung:
"sh: bbb.txt: unknown operand"
Hast du eine Idee, woran es liegt?
Mitglied: 131026
131026 Oct 15, 2016 at 22:37:47 (UTC)
Goto Top
Nö, hier lüppt das mit sämtlichen Ordnern und Unterordnern.
Member: highpriest
highpriest Oct 15, 2016 at 22:55:26 (UTC)
Goto Top
Ich mache irgendwas mit LOCALDIR falsch.
REMOTEDIR ist ja das was ich kopieren möchte, LOCALDIR liegt aber auf einem anderen Gerät.
Wenn ich den LOCALDIR von dem anderen Gerät eintrage, klatscht er als Zielpfad LOCALDIR/REMOTEDIR und das wird ja nicht gefunden.
Wenn ich im Script "curl -o "$LOCALDIR$1$f" "$URL$1$f" auf "$LOCALDIR$f" ändere, geht zwar mit einer Datei, bei mehreren Dateien bekomme ich die o.g Meldung. Ich stehe auf dem Schlauch mit LOCALDIR.
Mitglied: 131026
131026 Oct 16, 2016 updated at 06:53:44 (UTC)
Goto Top
Falsch LOCALDIR ist der Rootpfad in den die Dateien heruntergeladen werden! Dort wird die gleiche Ordnerstruktur wie auf dem zu herunterladenden Verzeichnis auf dem FTP-Server erstellt, Unterordner also angelegt falls sie noch nicht existieren.

ACHTUNG Das Skript ist nur für Unix FTP-Server gedacht und funktioniert nur dort weil es die Ordner und Dateien anhand der Auflistung des Server-OS unterscheidet (drwx r x r etc.)

Aber wie gesagt das Verfahren ist super ineffizient, da sich für jede Datei, jede Verzeichnisauflistung curl neu mit dem FTP-Verbinden muss. Das ist also vollkommener Quatsch das so zu machen!! Das macht heutzutage kein Mensch so, wenn es unter Linux ja schon die passenden Tools dafür gibt.