使用文件名中的空格卷曲上传

问题描述:

我正在尝试使用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 
} 
+1

我不能与我的卷曲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

你有没有尝试过在你的脚本改变IFS价值?通常它的值设置为$' \t\n',其中包括空格。将它设置为如下所示:IFS=并且根本不执行字段分割。通过执行unset IFS可以返回默认值。

实施例:

var="a b c d" 
echo $var 
a b c d 
IFS= 
echo $var 
a b c d