使用curl通过FTP上传多个文件


14

我正在尝试使用curl通过FTP将当前文件夹内的所有文本文件上传到服务器位置。我尝试了以下行:

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

其中XXX是服务器的IP地址,而YYY是用户名和密码。

我能够将file1.txt成功传输到服务器,但它抱怨第二个文件说“无法打开'file_name'!”。

我交换了文件名,它适用于file2.txt,而不适用于file1.txt。似乎我的语法有误,但这是手册所说的吗?

另外,理想情况下,我将能够执行以下操作:

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

因为我并不总是知道当前文件夹中txt文件的名称或要传输的文件数。

我认为我可能必须编写一个bash脚本,将bash的输出收集ls *.txt到一个数组中,然后将其放入curl所需的多文件格式。

我之前没有做过bash脚本编写-这是实现这一目标的最简单方法吗?

Answers:


20

您的第一个命令应该在没有空格的情况下工作:

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

还要注意上面URL中的尾部“ /”。

这是curl关于选项“ -T”的手动输入:

-T,-上传文件

这会将指定的本地文件传输到远程URL。如果指定的URL中没有文件部分,则Curl将附加本地文件名。注意,必须在最后一个目录上使用结尾的/,才能真正向Curl证明没有文件名,或者curl会认为您的最后一个目录名是要使用的远程文件名。这很可能导致上传操作失败。如果在HTTP(S)服务器上使用此命令,则将使用PUT命令。

使用文件名“-”(一个破折号)来使用stdin而不是给定的文件。或者,文件名“。”。可以指定(单个句点)而不是“-”来在非阻塞模式下使用stdin,以允许在上传stdin时读取服务器输出。

您可以在命令行中为每个URL指定一个-T。每个-T + URL对指定要上传的内容以及上传到的位置。curl还支持-T参数的“ globbing”,这意味着您可以使用URL支持的相同URL globbing样式将多个文件上传到单个URL,如下所示:

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

甚至

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

“ * .txt”扩展不起作用,因为curl只支持与URL相同的语法:

您可以通过在括号内编写零件集来指定多个URL或URL的一部分,如下所示:

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

或者,您也可以使用[]来获取字母数字系列的序列,如下所示:

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

ftp://ftp.numericals.com/file [001-100] .txt (带前导零)

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

[...]

当从命令行提示符处调用使用[]或{}序列时,可能必须将完整的URL放在双引号中,以避免shell干扰它。其他特殊字符也是如此,例如'&','?' 和“ *”。

但是,您可以像这样使用“普通”外壳程序:

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

(最后一个示例可能无法在所有shell中或在任何种类的奇异文件名中都起作用。)


$(perl -e 'print join(",",@ARGV)' *.txt)将正确处理带有空格的文件名。
ivan_pozdeev,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.