2017-08-09 107 views
0

我正在嘗試使用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

回答

0

你有沒有嘗試過在你的腳本改變IFS價值?通常它的值設置爲$' \t\n',其中包括空格。將它設置爲如下所示:IFS=並且根本不執行字段分割。通過執行unset IFS可以返回默認值。

實施例:

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