【发布时间】:2020-08-23 01:38:02
【问题描述】:
我正在尝试通过在 Server2 上运行的脚本将 Server1 上指定目录中的所有文件传输到 Server3。
到 Server3 的传输必须通过 API 进行,因此必须使用以下 CURL 调用:
curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer $token" \
--header "Dropbox-API-Arg: {\"path\": \"/xfer/$name\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}" \
--header "Content-Type: application/octet-stream" \
--data-binary @$f
如果它只是 1 个文件,我可以成功,但我试图遍历 Server1 上的目录并将文件直接发送到 CURL 调用。到目前为止,我得到了:
files="( $(ssh me@server1 ls dir/*) )"
while read f
do
name=$(basename ${f})
curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer $token" \
--header "Dropbox-API-Arg: {\"path\": \"/xfer/$name\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}" \
--header "Content-Type: application/octet-stream" \
--data-binary @$f
done <<< "$files"
循环似乎正在将文件数组中的“(”读取到第一个文件名中,这显然会导致问题。我无法超越这一点来判断是否在循环中发布当前文件via --data-binary 实际上会按照我的想法(或希望)做。
有什么办法吗?
【问题讨论】:
-
你为什么有那些额外的外括号?
-
创建一个数组,这样带有空格的文件名就不会被分成多个字符串,但这似乎不起作用,因为
echo ${#files[@]}返回1,即使有多个文件。我做错了什么?
标签: bash loops curl pipe remote-server