Enviando vários arquivos via ftp usando curl

9

Estou tentando carregar todos os arquivos de texto da pasta atual via FTP para um servidor usando CURL. Eu tentei a seguinte linha:

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

em que XXX é o endereço IP do servidor e YYY é o nome de usuário: senha. Eu sou capaz de transferir file1.txt para o servidor com êxito, mas reclamações sobre o segundo arquivo dizendo 'Não é possível abrir' file_name '!'

Troquei os nomes dos arquivos e funcionou para file2.txt e não para file1.txt. Parece que a sintaxe está errada, mas é isso que o manual diz?

Além disso, idealmente eu gostaria de fazer algo assim:

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

porque nem sempre sei os nomes dos arquivos txt na pasta atual ou o número de arquivos a serem transferidos. Eu sou da opinião que posso ter que escrever um script bash que coleta a saída de 'ls * .txt' em uma matriz e colocá-lo no formato de vários arquivos necessários para curl. Eu não fiz bash scripting antes - esta é a maneira mais simples de conseguir isso?

    
por JJT 10.10.2016 / 13:12

1 resposta

11

Sua primeira linha de comando deve funcionar sem espaços em branco:

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

Observe também o "/" no URL acima.

Este é o manual do curl sobre a opção "-T":

-T, --upload-file

This transfers the specified local file to the remote URL. If there is no file part in the specified URL, Curl will append the local file name. NOTE that you must use a trailing / on the last directory to really prove to Curl that there is no file name or curl will think that your last directory name is the remote file name to use. That will most likely cause the upload operation to fail. If this is used on an HTTP(S) server, the PUT command will be used.

Use the file name "-" (a single dash) to use stdin instead of a given file. Alternately, the file name "." (a single period) may be specified instead of "-" to use stdin in non-blocking mode to allow reading server output while stdin is being uploaded.

You can specify one -T for each URL on the command line. Each -T + URL pair specifies what to upload and to where. curl also supports "globbing" of the -T argument, meaning that you can upload multiple files to a single URL by using the same URL globbing style supported in the URL, like this:

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

or even

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

"*. txt" expansão não funciona porque curl suporta apenas a mesma sintaxe usada para URLs:

You can specify multiple URLs or parts of URLs by writing part sets within braces as in:

http://site.{one,two,three}.com

or you can get sequences of alphanumeric series by using [] as in:

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

ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)

ftp://ftp.letters.com/file[a-z].txt

[...]

When using [] or {} sequences when invoked from a command line prompt, you probably have to put the full URL within double quotes to avoid the shell from interfering with it. This also goes for other characters treated special, like for example '&', '?' and '*'.

Mas você pode usar o "normal" shell globbing assim:

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

(O último exemplo pode não funcionar em todos os shells ou com qualquer tipo de nome de arquivo exótico).

    
por 10.10.2016 / 13:57