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


14

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スクリプトを作成したことがありません-これはこれを実現する最も簡単な方法ですか?

回答:


20

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

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

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

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

-T、-アップロードファイル

これにより、指定したローカルファイルがリモート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/

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

次のように中括弧内にパーツセットを記述することにより、複数の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[az].txt

[...]

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

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

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

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


$(perl -e 'print join(",",@ARGV)' *.txt)スペースを含むファイル名を正しく処理します。
ivan_pozdeev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.