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

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

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

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

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

file1.txt をサーバーに正常に転送できますが、2 番目のファイルに対して「'file_name' を開けません!」と文句を言います。

ファイルの名前を変更し、file1.txtの代わりにfile2.txtで動作します。私の構文は間違っているようですが、マニュアルに記載されているものは何ですか?

また、理想的には、次のことができます。

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

なぜなら、現在のフォルダにあるtxtファイルの名前や転送するファイルの数を常に知らないからです。

この出力をls *.txt配列として収集し、カールに必要なマルチファイル形式で保存するには、bashスクリプトを作成する必要があります。

以前はbashスクリプトを書いたことがありません。これがこれを達成する最も簡単な方法ですか?

答え1

最初のコマンドはスペースなしで実行する必要があります。

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

また参考にしてください上記URLの末尾の「/」です。

オプション「-T」に関するカールの手動項目は次のとおりです。

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

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

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

コマンドラインで各URLに-Tを指定できます。各-T + URLペアは、アップロードするコンテンツと場所を指定します。カールは-Tパラメータの「globbing」もサポートします。つまり、次のようにURLでサポートされているのと同じURL globbingスタイルを使用して、複数のファイルを単一のURLにアップロードできます。

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

でも

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

'*.txt'拡張子は機能しません。カールはURLと同じ構文のみをサポートしているので:

次のように中括弧内にサブセットを作成して、複数のURLまたはURLの一部を指定できます。

http://サイト.{日,この,三}.com

または、[]を使用して、次の一連の英数字系列を取得できます。

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

ftp://ftp.numericals.com/file[001-100].txt (前に0がつく)

ftp://ftp.letters.com/file[az].txt

[...]

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

しかし、次のように「一般」シェルワイルドカードを使用できます。

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

(この最後の例は、すべてのシェルまたはあらゆる種類の外部ファイル名では機能しない可能性があります。)

答え2

Findユーティリティを使用して、各ファイルに対して順番にカールを呼び出すことができます。

find . -name '*.txt' -exec curl -T {} ftp://XXX --user YYY \;

答え3

すべての.txtファイルをマップし、すべての外部ファイル名をFTPサーバーにアップロードできます。

1 - マッピングファイルを使用してアップロードするすべてのファイルをマッピングし、それをfilename変数に保存します。

マップファイル

使用例

#出力を配列としてキャプチャします。

$ mapfile GEEKSFORGEEKS < <(printf "プロジェクト 1\nプロジェクト 2\nプロジェクト 3\n") $ echo ${GEEKSFORGEEKS[@]}

ここで、Item1、Item2、およびItem 3はGEEKSFORGEEKS配列に格納されています。

ここで詳細を確認してください:[geeksforgeeks] [2]

2-ファイル名配列に保存されているすべてのファイルを読み取り、既に存在するかどうかを確認するループを作成し($i -lt ${#filenames[@]})、FTPにアップロードし、すべての外部ファイル名をグロービング(-g)、自動(-s)(標準入力としてのみ出力) - )

コンソールで直接テストしましたが、うまくいきました。

filenames=(); mapfile -d '' filenames < <(find . -name '*.txt' -type f -print0)

i=0; for f in ${filenames[@]}; do [[ $i -lt ${#filenames[@]} ]] && curl -g -s -S -T "${f}" ftp://XXX/ -user YYY; i=$i+1; done

[2]: https://www.geeksforgeeks.org/mapfile-command-in-linux-with-examples/#:~:text=mapfile%20 also%20 は %20 と呼ばれます (%20array を読み、%20を%と比較してください)20a%20Read%20ループ。

関連情報