Téléchargement de plusieurs fichiers via FTP en utilisant curl

14

J'essaie de télécharger tous les fichiers texte dans le dossier actuel via FTP vers un emplacement de serveur en utilisant curl. J'ai essayé la ligne suivante:

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

où XXX est l'adresse IP du serveur et YYY est le nom d'utilisateur et le mot de passe.

Je suis en mesure de transférer avec succès file1.txt vers le serveur, mais il se plaint que le deuxième fichier indique "Impossible d'ouvrir" nom_fichier "!"

J'ai échangé les noms de fichiers et cela a fonctionné pour file2.txt et non file1.txt. On dirait que j'ai une mauvaise syntaxe, mais c'est ce que dit le manuel?

Aussi, idéalement, je serais capable de faire quelque chose comme ça:

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

parce que je ne connais pas toujours les noms des fichiers txt dans le dossier actuel ou le nombre de fichiers à transférer.

Je suis d'avis que je devrais peut-être écrire un script bash qui collecte la sortie de ls *.txtdans un tableau et le mettre dans le format de fichiers multiples requis par curl.

Je n'ai jamais fait de script bash auparavant - est-ce le moyen le plus simple d'y parvenir?

JJT
la source

Réponses:

20

Votre première commande devrait fonctionner sans espaces blancs:

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

Notez également le "/" de fin dans les URL ci-dessus.

Ceci est l'entrée manuelle de curl sur l'option "-T":

-T, --fichier-upload

Cela transfère le fichier local spécifié vers l'URL distante. S'il n'y a aucune partie de fichier dans l'URL spécifiée, Curl ajoutera le nom du fichier local. REMARQUE: vous devez utiliser un signe de fin / sur le dernier répertoire pour vraiment prouver à Curl qu'il n'y a pas de nom de fichier ou curl pensera que votre dernier nom de répertoire est le nom de fichier distant à utiliser. Cela entraînera très probablement l'échec de l'opération de téléchargement. Si cela est utilisé sur un serveur HTTP (S), la commande PUT sera utilisée.

Utilisez le nom de fichier "-" (un seul tiret) pour utiliser stdin au lieu d'un fichier donné. Alternativement, le nom de fichier "." (une seule période) peut être spécifié au lieu de "-" pour utiliser stdin en mode non bloquant pour permettre la lecture de la sortie du serveur pendant le téléchargement de stdin.

Vous pouvez spécifier un -T pour chaque URL sur la ligne de commande. Chaque paire d'URL -T + spécifie quoi télécharger et où. curl prend également en charge le "globbing" de l'argument -T, ce qui signifie que vous pouvez télécharger plusieurs fichiers vers une seule URL en utilisant le même style de globbing d'URL pris en charge dans l'URL, comme ceci:

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

ou même

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

L'expansion "* .txt" ne fonctionne pas car curl ne prend en charge que la même syntaxe que pour les URL:

Vous pouvez spécifier plusieurs URL ou parties d'URL en écrivant des jeux de parties entre accolades comme dans:

http: // site . {un, deux, trois} .com

ou vous pouvez obtenir des séquences de séries alphanumériques en utilisant [] comme dans:

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

ftp://ftp.numericals.com/file[001-100].txt (avec zéros)

ftp://ftp.letters.com/file}azaz.txt

[...]

Lorsque vous utilisez des séquences [] ou {} lorsqu'elles sont appelées à partir d'une invite de ligne de commande, vous devez probablement mettre l'URL complète entre guillemets doubles pour éviter que le shell n'interfère avec. Cela vaut également pour d'autres personnages traités comme spéciaux, comme par exemple '&', '?' et '*'.

Mais vous pouvez utiliser le globbing "normal" comme ceci:

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

(Le dernier exemple peut ne pas fonctionner dans tous les shells ou avec tout type de nom de fichier exotique.)

rudimeier
la source
$(perl -e 'print join(",",@ARGV)' *.txt)gérera correctement les noms de fichiers avec des espaces.
ivan_pozdeev