Carga de múltiples archivos a través de FTP usando curl

14

Estoy tratando de cargar todos los archivos de texto dentro de la carpeta actual a través de FTP a una ubicación de servidor usando curl. Probé la siguiente línea:

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

donde XXX es la dirección IP del servidor e YYY es el nombre de usuario y la contraseña.

Puedo transferir file1.txt al servidor con éxito, pero se queja del segundo archivo que dice '¡No se puede abrir' file_name '!'

Cambié los nombres de archivo y funcionó para file2.txt y no file1.txt. Parece que tengo la sintaxis incorrecta, pero ¿esto es lo que dice el manual?

Además, idealmente podría hacer algo como esto:

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

porque no siempre sabré los nombres de los archivos txt en la carpeta actual o la cantidad de archivos que se transferirán.

Soy de la opinión de que es posible que tenga que escribir un script bash que recopile la salida de ls *.txtuna matriz y la coloque en el formato de múltiples archivos requerido por curl.

No he hecho scripts de bash antes, ¿es esta la forma más sencilla de lograr esto?

J, J; T
fuente

Respuestas:

20

Su primer comando debería funcionar sin espacios en blanco:

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

También tenga en cuenta el "/" final en las URL anteriores.

Esta es la entrada manual de curl sobre la opción "-T":

-T, --upload-file

Esto transfiere el archivo local especificado a la URL remota. Si no hay parte del archivo en la URL especificada, Curl agregará el nombre del archivo local. TENGA EN CUENTA que debe usar un seguimiento / en el último directorio para demostrar realmente a Curl que no hay un nombre de archivo o curl pensará que su último nombre de directorio es el nombre de archivo remoto a usar. Lo más probable es que la operación de carga falle. Si esto se usa en un servidor HTTP (S), se usará el comando PUT.

Use el nombre de archivo "-" (un solo guión) para usar stdin en lugar de un archivo dado. Alternativamente, el nombre del archivo "." (un solo período) puede especificarse en lugar de "-" para usar stdin en modo sin bloqueo para permitir leer la salida del servidor mientras se está cargando stdin.

Puede especificar una -T para cada URL en la línea de comando. Cada par de URL -T + especifica qué cargar y dónde. curl también es compatible con el "globbing" del argumento -T, lo que significa que puede cargar varios archivos en una sola URL utilizando el mismo estilo de globbing de URL admitido en la URL, de esta manera:

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

o incluso

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

La expansión "* .txt" no funciona porque curl solo admite la misma sintaxis que para las URL:

Puede especificar varias URL o partes de URL escribiendo conjuntos de partes entre llaves como en:

http: // sitio . {uno, dos, tres} .com

o puede obtener secuencias de series alfanuméricas usando [] como en:

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

ftp://ftp.numericals.com/file[001-100font>.txt (con ceros a la izquierda)

ftp://ftp.letters.com/file[azfont>.txt

[...]

Al usar secuencias [] o {} cuando se invoca desde una línea de comando, probablemente tenga que poner la URL completa entre comillas dobles para evitar que el shell interfiera con ella. Esto también se aplica a otros caracteres tratados como especiales, como por ejemplo '&', '?' y '*'.

Pero podría usar el globo "normal" como este:

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

(El último ejemplo puede no funcionar en todos los shells o con cualquier tipo de nombre de archivo exótico).

rudimeier
fuente
$(perl -e 'print join(",",@ARGV)' *.txt)manejará correctamente los nombres de archivo con espacios.
ivan_pozdeev