Hochladen mehrerer Dateien über FTP mit Curl

14

Ich versuche, alle Textdateien im aktuellen Ordner per FTP mit curl auf einen Serverstandort hochzuladen. Ich habe folgende Zeile ausprobiert:

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY

Dabei ist XXX die IP-Adresse des Servers und JJJ der Benutzername und das Passwort.

Ich kann file1.txt erfolgreich auf den Server übertragen, aber es wird über die zweite Datei mit der Meldung "Dateiname kann nicht geöffnet werden!" Beschwert.

Ich habe die Dateinamen ausgetauscht und es funktionierte für file2.txt und nicht für file1.txt. Scheint, als hätte ich die falsche Syntax, aber das steht im Handbuch?

Idealerweise könnte ich auch so etwas tun:

 curl -T *.txt ftp://XXX --user YYY

weil ich nicht immer die Namen der txt-Dateien im aktuellen Ordner oder die Anzahl der zu übertragenden Dateien kenne.

Ich bin der Meinung, dass ich möglicherweise ein Bash-Skript schreiben muss, das die Ausgabe von ls *.txtin einem Array sammelt und in das für curl erforderliche Format mit mehreren Dateien legt.

Ich habe noch nie Bash-Scripting durchgeführt - ist dies der einfachste Weg, dies zu erreichen?

JJT
quelle

Antworten:

20

Ihr erster Befehl sollte ohne Leerzeichen funktionieren:

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY

Beachten Sie auch das nachfolgende "/" in den obigen URLs.

Dies ist der manuelle Eintrag von curl zur Option "-T":

-T, --upload-Datei

Dadurch wird die angegebene lokale Datei an die Remote-URL übertragen. Wenn die angegebene URL keinen Dateiteil enthält, hängt Curl den lokalen Dateinamen an. HINWEIS: Sie müssen ein abschließendes / für das letzte Verzeichnis verwenden, um Curl wirklich zu beweisen, dass es keinen Dateinamen gibt. Curl geht davon aus, dass Ihr letzter Verzeichnisname der zu verwendende Remote-Dateiname ist. Dies führt höchstwahrscheinlich dazu, dass der Upload-Vorgang fehlschlägt. Wenn dies auf einem HTTP (S) -Server verwendet wird, wird der PUT-Befehl verwendet.

Verwenden Sie den Dateinamen "-" (ein einzelner Bindestrich), um stdin anstelle einer bestimmten Datei zu verwenden. Alternativ kann der Dateiname "." (ein einzelner Punkt) kann anstelle von "-" angegeben werden, um stdin im nicht blockierenden Modus zu verwenden, damit die Serverausgabe gelesen werden kann, während stdin hochgeladen wird.

Sie können für jede URL in der Befehlszeile ein -T angeben. Jedes -T + URL-Paar gibt an, was und wohin hochgeladen werden soll. curl unterstützt auch das "Globbing" des -T-Arguments. Dies bedeutet, dass Sie mehrere Dateien auf eine einzelne URL hochladen können, indem Sie denselben in der URL unterstützten URL-Globbing-Stil verwenden, wie folgt:

curl -T "{file1,file2}" http://www.uploadtothissite.com

oder auch

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

Die Erweiterung "* .txt" funktioniert nicht, da Curl nur dieselbe Syntax wie für URLs unterstützt:

Sie können mehrere URLs oder Teile von URLs angeben, indem Sie Teilesätze in geschweifte Klammern schreiben, wie in:

http: // site . {eins, zwei, drei} .com

oder Sie können Sequenzen von alphanumerischen Reihen erhalten, indem Sie [] wie folgt verwenden:

ftp://ftp.numericals.com/file[1-100‹.txt

ftp://ftp.numericals.com/file[001-100‹.txt (mit führenden Nullen)

ftp://ftp.letters.com/file[az weibl.txt

[...]

Wenn Sie beim Aufrufen über eine Befehlszeile Eingabeaufforderungen [] oder {} verwenden, müssen Sie wahrscheinlich die vollständige URL in doppelte Anführungszeichen setzen, um zu verhindern, dass die Shell sie stört. Dies gilt auch für andere Zeichen, die speziell behandelt werden, wie z. B. '&', '?' und '*'.

Aber Sie könnten das "normale" Shell-Globbing wie folgt verwenden:

curl -T "{$(echo *.txt | tr ' ' ',')}" ftp://XXX/ -user YYY

(Das letzte Beispiel funktioniert möglicherweise nicht in allen Shells oder mit exotischen Dateinamen.)

rudimeier
quelle
$(perl -e 'print join(",",@ARGV)' *.txt)behandelt Dateinamen mit Leerzeichen korrekt.
ivan_pozdeev