find <> -exec curl ... 对于 ftp 文件上传,有 url 编码问题,对于带有随机字符的文件名

问题描述 投票:0回答:1

用例: 我正在尝试将数据/所有内容从我的 Android 手机复制到同一 wifi 上的笔记本电脑,并维护目录结构。我知道有很多方法,但我喜欢这样做(如下)并且需要帮助。然后在笔记本电脑上使用这些文件执行任何操作。

从手机上传到笔记本电脑 ftp 服务器的文件示例/目录结构 -

dir1
  |--1.mp3
  |--dir2
       |--download  1.jpg
       |--download (2).jpg

如何重现: 在移动设备中,我有类似于 Ubuntu 的终端。在笔记本电脑中,我使用 python 运行 ftp 服务器。 从移动设备上,我运行下面的命令,它工作正常,只是目录结构未维护,并将每个文件转储到 ftp 的根目录(我知道为什么 bcz url 中没有路径)。

find dir1 -type f -exec curl -u ftp:ftp --ftp-create-dirs -T {} ftp://192.168.x.x/ \;

重点是,curl 的 url 中没有文件名/路径,因此不存在 url 编码问题。所有文件都上传到根目录。

因此,为了维护子目录结构,我必须执行以下 url 调用。

find dir1 -type f -exec curl -u ftp:ftp --ftp-create-dirs -T {} ftp://192.168.x.x/{} \;

现在,由于 url 编码,它会对具有 spaces(, ) 或类似内容的文件名抛出错误。例如“download 1.jpg”和“download (2).jpg

curl: (3) URL using bad/illegal format or missing URL

到目前为止我尝试过的东西(回显我在下面使用来显示变量值)-

find dir1 -type f -exec bash -c 'y=$(echo "$1"); fname=$(echo $y | sed "s/ /%20/g"); echo $y;echo $fname;echo ""; curl -u ftp:ftp --ftp-create-dirs -T $y ftp://192.168.x.x/$fname' bash {} \;

输出-

dir1/1.mp3
dir1/1.mp3

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

dir1/dir2/download 1.jpg
dir1/dir2/download%201.jpg

curl: Can't open 'dir1/dir2/download'
curl: try 'curl --help' for more information
curl: (26) Failed to open/read local data from file/application

dir1/dir2/download (2).jpg
dir1/dir2/download%20(2).jpg

curl: (3) URL using bad/illegal format or missing URL

所以你可以看到我遇到的问题是 url 编码。即使我已经完成了空间编码,它也不起作用。而且还会有更多随机角色。

我想使用curl的--data-urlencoding,但这不允许-G与-T,或-T与--data。 另外还会有一个“?”如果要工作的话,以这种方式添加字符串,这不是我的用例。

curl urlencode
1个回答
0
投票

好吧,我做到了。由于它是移动的,我想让它远离任何其他软件包/工具并保持基础知识。 sed 帮助我进行 url 编码。 此外,github 的this-page 也有助于将这些映射器收集到一个地方。

我必须测试它们,很少会引起问题,因为我的代码是如何编写的。 例如“s/'/%27/g”“s/\/%5c/g”

这导致将 $ 放在每个上传文件的末尾 - “s/$/%24/g”

这很热,它有效。

find dir1 -type f -exec bash -c 'y=$(echo "$1"); fname=$(echo $y | sed -e "s/%/%25/g" -e "s/ /%20/g" -e "s/!/%21/g" -e "s/#/%23/g" -e "s/(/%28/g" -e "s/)/%29/g" -e "s/+/%2b/g" -e "s/,/%2c/g" -e "s/-/%2d/g" -e "s/:/%3a/g" -e "s/;/%3b/g" -e "s/?/%3f/g" -e "s/@/%40/g" -e "s/\&/%26/g" -e "s/\*/%2a/g" -e "s/\./%2e/g" -e "s/\//%2f/g" -e "s/\[/%5b/g" -e "s/\]/%5d/g" -e "s/\^/%5e/g" -e "s/_/%5f/g" -e "s/{/%7b/g" -e "s/|/%7c/g" -e "s/}/%7d/g" -e "s/~/%7e/g" -e "s/\"/%22/g" -e "s/\`/%60/g"); echo $y;echo $fname;echo ""; curl -u ftp:ftp --ftp-create-dirs -T "$y" ftp://192.168.x.x/$fname ; echo ""' bash {} \;
© www.soinside.com 2019 - 2024. All rights reserved.