web-dev-qa-db-ja.com

curlを使用してFTP経由で複数のファイルをアップロードする

Curlを使用して、現在のフォルダー内のすべてのテキストファイルをFTP経由でサーバーの場所にアップロードしようとしています。私は次の行を試しました:

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY

ここで、XXXはサーバーのIPアドレス、YYYはユーザー名とパスワードです。

File1.txtをサーバーに正常に転送できましたが、2番目のファイルに「Ca n't open 'file_name'!」というメッセージが表示されます。

ファイル名を入れ替えたところ、file1.txtではなくfile2.txtで機能しました。構文が間違っているようですが、これはマニュアルに書かれていることですか?

また、理想的には次のようなことができるでしょう:

 curl -T *.txt ftp://XXX --user YYY

現在のフォルダー内のtxtファイルの名前や転送されるファイルの数が常にわからないためです。

私は、ls *.txtの出力を配列に収集し、curlで必要な複数ファイル形式に配置するbashスクリプトを作成する必要があると考えています。

私は以前にbashスクリプトを作成したことがありません-これはこれを実現する最も簡単な方法ですか?

14
JJT

最初のコマンドは空白なしで動作するはずです:

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY

また、上記のURLの末尾の「/」にも注意してください

これは、オプション「-T」に関するcurlの手動エントリです。

-T、-upload-file

これにより、指定したローカルファイルがリモートURLに転送されます。指定されたURLにファイル部分がない場合、Curlはローカルファイル名を追加します。ファイル名がないことをCurlに実際に証明するには、最後のディレクトリで末尾の/を使用する必要があります。そうしないと、curlは最後のディレクトリ名が使用するリモートファイル名であると見なします。これにより、アップロード操作が失敗する可能性が高くなります。これがHTTP(S)サーバーで使用される場合、PUTコマンドが使用されます。

特定のファイルの代わりにstdinを使用するには、ファイル名 "-"(単一のダッシュ)を使用します。または、ファイル名「。」 「-」の代わりに(単一ピリオド)を指定して、非ブロッキングモードでstdinを使用し、stdinのアップロード中にサーバー出力を読み取ることができます。

コマンドラインで、URLごとに1つの-Tを指定できます。 -T + URLの各ペアは、何をどこにアップロードするかを指定します。 curlは、-T引数の「グロビング」もサポートします。つまり、次のように、URLでサポートされているのと同じURLグロビングスタイルを使用して、複数のファイルを単一のURLにアップロードできます。

curl -T "{file1,file2}" http://www.uploadtothissite.com

あるいは

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

"*。txt"展開は機能しませんcurlはURLと同じ構文しかサポートしていないためです:

次のように中括弧内にパーツセットを記述することで、複数のURLまたはURLの一部を指定できます。

http:// site 。{one、two、three} .com

または、次のように[]を使用して英数字シリーズのシーケンスを取得できます。

ftp://ftp.numericals.com/file [1-100] .txt

ftp://ftp.numericals.com/file [001-100] .txt (先行ゼロあり)

ftp://ftp.letters.com/file [a-z] .txt

[...]

コマンドラインプロンプトから呼び出されるときに[]または{}シーケンスを使用する場合、シェルが干渉しないように、完全なURLを二重引用符で囲む必要があります。これは、「&」、「?」など、特別に処理された他の文字にも当てはまります。および「*」。

しかし次のように「通常の」シェルグロビングを使用できます。

curl -T "{$(echo *.txt | tr ' ' ',')}" ftp://XXX/ -user YYY

(最後の例は、すべてのシェルまたは任意の種類のエキゾチックなファイル名では機能しない場合があります。)

20
rudimeier