2017-08-09 26 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"を別々の2つのパスとして指定します。

この問題を解決するにはどうすればよいですか?

私の完全なコード:

#!/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'で何が間違っているかを最初に確認したいと思うかもしれませんが(私はそれほど多くはないと思われます)、実際の' curl'コマンドを検査する 'bash -x' – 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 
関連する問題