我正在嘗試使用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
}
我不能與我的捲曲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