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

JJT*_*JJT 17 ftp shell-script curl

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

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY
Run Code Online (Sandbox Code Playgroud)

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

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

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

此外,理想情况下,我将能够做这样的事情:

 curl -T *.txt ftp://XXX --user YYY
Run Code Online (Sandbox Code Playgroud)

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

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

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

rud*_*ier 24

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

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY
Run Code Online (Sandbox Code Playgroud)

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

这是 curl 关于选项“-T”的手册条目:

-T, --upload-file

这会将指定的本地文件传输到远程 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
Run Code Online (Sandbox Code Playgroud)

甚至

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/
Run Code Online (Sandbox Code Playgroud)

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

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

http://site .{一、二、三}.com

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

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

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

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

[...]

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

但是你可以像这样使用“普通”shell globbing:

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

(最后一个示例可能不适用于所有 shell 或任何类型的外来文件名。)

  • `$(perl -e 'print join(",",@ARGV)' *.txt)` 将正确处理带有空格的文件名。 (2认同)