我正在尝试使用cURL将文件名中带有空格的文件上传到专用服务器上。我正在使用bash。在之前的项目中,我放弃了,从文件名中删除所有空格。这对于这个项目是不可行的。
以详细模式运行cURL表示它在读取本地文件路径时停止:
curl -X PUT -u $USER:$PASS --data-binary @"$LOCAL_FILE" "$SERVER/remote.php/dav/files/$USER/$REMOTE_DIR/$REMOTE_FILE"
其中$ LOCAL_FILE是本地计算机上文件的路径(带空格),$ REMOTE_FILE也有空格。
这给出了:
警告:无法从文件" / Users / my_account / somepath / with
读取数据警告:空格
这意味着命令将"/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
}
答案 0 :(得分: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
答案 1 :(得分:0)
在Curl Windows 7.55.0版本中(也应该在更高版本中),以下命令将起作用,
本地Windows路径:路径用双引号或单引号引起来
服务器url路径:路径用双引号或单引号引起来,并且每个空格都用'%20'替换,下面给出了上传“ tes st.txt”的示例
curl -username:password -T“ ./Test/te st.txt”“ http://server-url/folder1/folder2/te%20st.txt”
答案 2 :(得分:0)
TL; DR :在文件名包含illegal characters, like | > < :
的Windows上仍然会出现问题@Jerin指出,在Windows上进行卷曲(至少在版本> 7.55.0中)将接受文件名中的空格。
但是,在curl 7.57.0(x86_64-w64-mingw32)中,我正在观察
curl -X POST http://localhost:8080/ -H "Content-Type: application/json" --data-binary "@my_dir/2019-11-04>.json"
给我
Warning: Couldn't read data from file "my_dir/2019-11-04>.json",
Warning: this makes an empty POST.
并且不会将文件作为POST数据传递。