Net::SFTPで複数ファイルをuploadする(ワイルドカード指定)

Ruby/Rails
スポンサーリンク

はじめに

Net::SFTPで*(アスタリスク)を使用したワイルドカード指定でファイルをアップロードする方法を紹介します。

と言いたいのですが、調べたところ素直に使うことはできないようです。結論からいうと、eachでループしてあげましょう。

Rubyでのコードで動作確認した内容をこの記事では記載しています。

Net::SFTP uploadの書き方

sftp.upload アップロードするファイル名 アップロード後のファイル名

Net::SFTPで複数ファイルをuploadする方法(公式)

素直に*(アスタリスク)などのワイルドカード指定で複数ファイルをアップロードすることはできません。

リファレンスをみても、以下のように書いています。eachを使っていますね。

Or, if you have multiple uploads that you want to run in parallel, you can employ the wait method of the returned object:
uploads = %w(file1 file2 file3).map { |f| sftp.upload(f, “remote/#{f}”) }
uploads.each { |u| u.wait }

http://net-ssh.github.io/net-sftp/

実際に検証して有効だったコード例

ワイルドカード指定してわかりやすく作るなら以下のようなコードがいいと思います。

/tmpディレクトリにある.csvファイルをSFTPサーバの/up_dirにアップロードする例です。コネクションを貼る部分は省略しています。

upload_files = "/tmp/*.csv"
upload_dir = "/up_dir"

Dir.glob(upload_files).each do | upload_file |
  sftp.upload! upload_file, File.join(upload_dir, File.basename(upload_file))
end

解説

Dir.globでワイルドカードで当てはまるファイルを配列にして、それをeachでループします。その中でsftpでuploadを行います。アップロード先のディレクトリに同名のファイルとしてアップするために、File.joinとFile.basenameを使って第二引数をうまく作ってあげます。

uploadとupload!の違い

uploadは非同期でファイル送信を行うようです。ひとつひとつしっかりファイルを送信したいという用途が多いと思いますので、upload!でいいかと思います。

コメント

タイトルとURLをコピーしました