Upload de vários arquivos via FTP usando curl

14

Estou tentando fazer upload de todos os arquivos de texto dentro da pasta atual via FTP para um local do servidor usando curl. Eu tentei a seguinte linha:

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

onde XXX é o endereço IP do servidor e AAA é o nome de usuário e a senha.

Consigo transferir file1.txt para o servidor com êxito, mas ele reclama do 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 eu tenho a sintaxe errada, mas é isso que o manual diz?

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

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

porque nem sempre vou saber os nomes dos arquivos txt na pasta atual ou o número de arquivos a serem transferidos.

Sou da opinião de que talvez eu precise escrever um script bash que colete a saída ls *.txtem uma matriz e coloque-a no formato de vários arquivos exigido pelo curl.

Eu não fiz scripts bash antes - esta é a maneira mais simples de conseguir isso?

J, J; T
fonte

Respostas:

20

Seu primeiro comando deve funcionar sem espaços em branco:

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

Observe também o "/" à direita nos URLs acima.

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

-T, --upload-file

Isso transfere o arquivo local especificado para o URL remoto. Se não houver parte do arquivo no URL especificado, o Curl acrescentará o nome do arquivo local. OBSERVE que você deve usar um / no último diretório para realmente provar a Ondulação que não há nome de arquivo ou a ondulação pensará que seu último nome de diretório é o nome de arquivo remoto a ser usado. Isso provavelmente fará com que a operação de upload falhe. Se isso for usado em um servidor HTTP (S), o comando PUT será usado.

Use o nome do arquivo "-" (um único traço) para usar stdin em vez de um determinado arquivo. Como alternativa, o nome do arquivo "." (um único período) pode ser especificado em vez de "-" para usar o stdin no modo sem bloqueio para permitir a leitura da saída do servidor enquanto o stdin está sendo carregado.

Você pode especificar um -T para cada URL na linha de comando. Cada par -T + URL especifica o que enviar e para onde. O curl também suporta "globbing" do argumento -T, o que significa que você pode fazer upload de vários arquivos em um único URL usando o mesmo estilo de globbing de URL suportado no URL, assim:

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

ou mesmo

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

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

Você pode especificar vários URLs ou partes de URLs escrevendo conjuntos de peças dentro de chaves, como em:

http: // site . {um, dois, três} .com

ou você pode obter seqüências de séries alfanuméricas usando [] como em:

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

ftp://ftp.numericals.com/file[001-100unette.txt (com zeros à esquerda)

ftp://ftp.letters.com/file[azorgeous.txt

[...]

Ao usar seqüências [] ou {} quando invocadas em um prompt de linha de comando, você provavelmente precisará colocar a URL completa entre aspas duplas para evitar que o shell interfira nela. Isso também vale para outros caracteres tratados como especiais, como por exemplo '&', '?' e '*'.

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

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

(O último exemplo pode não funcionar em todas as conchas ou com qualquer tipo de nome de arquivo exótico.)

rudimeier
fonte
$(perl -e 'print join(",",@ARGV)' *.txt)manipulará corretamente os nomes de arquivos com espaços.
Ivan_pozdeev 5/12/19