文件名中包含空格的卷曲上传

Mic*_*dan 6 bash shell filenames curl spaces

我正在尝试使用 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
}
Run Code Online (Sandbox Code Playgroud)

boo*_*jum 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
Run Code Online (Sandbox Code Playgroud)