使用文件名中的空格卷曲上传
问题描述:
我正在尝试使用cURL将其文件名中包含空格的文件上载到专用服务器上。我正在使用bash。在之前的项目中,我只是放弃了,从文件名中删除所有空格。这对这个项目来说是不可行的。使用文件名中的空格卷曲上传
在详细模式下运行卷曲表明它时,它读取我的本地文件路径停止:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
其中$ LOCAL_FILE是我的本地机器上的文件的路径(含空格),$ REMOTE_FILE也有空格。
这给:
警告:无法与
警告从文件中读取数据“/用户/ my_account的/ somepath /:空格
这意味着该命令正在"/Users/my_account/somepath/with"
和"spaces"
作为两条独立路径。
我该如何解决这个问题?
我全码:
#!/bin/bash -ex
# Local dir - note space in path
IMAGES_DIR="/Users/my_account/somepath/with spaces"
# Remote server, and credentials
SERVER="http://myserver"
REMOTE_DIR="mydir"
USER="myname"
PASS="mypass"
FILE="$1"
LOCAL_FILE="$IMAGES_DIR/$FILE"
REMOTE_FILE=urlencode $FILE
# Move file to the server
curl -v -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
# Check that file has made it
echo 'Waiting for file to be on server'
until [ $result > 0 ]
do
result=$(curl -I "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE" -u $USER:$PASS 2>/dev/null | grep Content-Length | awk -F ': ' '{print $2}')
echo "."
sleep 2
done
echo "File $FILE is now on server."
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for ((i = 0; i < length; i++)); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
答
你有没有尝试过在你的脚本改变IFS
价值?通常它的值设置为$' \t\n'
,其中包括空格。将它设置为如下所示:IFS=
并且根本不执行字段分割。通过执行unset IFS
可以返回默认值。
实施例:
var="a b c d"
echo $var
a b c d
IFS=
echo $var
a b c d
我不能与我的卷曲7.29.0,与'回声 “一些内容”> “用空格文件” 测试重现; NC -l -p 4242 -c“回波-e“HTTP/1.1 200 OK \ n \ nresponse”'&curl -v http:// localhost:4242/--data-binary @“带空格的文件”';你可能想首先检查curl -v是什么问题(我不期望会透露很多),然后用'bash -x'来检查实际的'curl'命令 – Aaron