用例: 我正在尝试将数据/所有内容从我的 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。 另外还会有一个“?”如果要工作的话,以这种方式添加字符串,这不是我的用例。
好吧,我做到了。由于它是移动的,我想让它远离任何其他软件包/工具并保持基础知识。 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 {} \;