はじめに
BOXDrive (エクスプローラー) からS3へコマンドでデータをアップロードする際、
ファイル名・S3パスともに可変にさせたかったのでコードを書きました。
cmdは初めて書く初心者です。
使用コード
REM 月次でフォルダを分けたいため今日の日付-1月のyyyymmを作成
set dt=%date%
set yy=%dt:~-10,4%
set mm=%dt:~-5,2%
if %mm% == 01 (
set /a x= %yy%%mm%-89
) else (
set /a x= %yy%%mm%-1
)
REM S3側処理
REM 月次フォルダを作る
set s3=[転送先S3pass]
set fullpath=%s3%%x%/
REM BOXDrive側処理
REM dir設定
set dir=[転送元BOXDrivepass]
set dir=%dir%\%x%
aws s3 cp --recursive --exclude "*" --include "*.csv" %dir% %fullpath% --profile [S3folderのprofile]
コード説明
・日付作成ブロック
今日の日付からsubstringを駆使してyyyyとmmを作成しており、
作りたいのは前月のデータなので、monthは-1、
各年1月の前月は「前年の12月」なので、-89しています。
例 : 2022年1月の前月値 (2021年12月) を作る場合は、2201-2112 = 89
こちらを流用させていただきました。ありがとうございます。
・S3側処理ブロック / BOXDrive側処理
それぞれのパスの一番後ろに前月フォルダ名 (yyyymm) を文字列結合しています。
・S3へコピー
基本構文はaws s3 cp [転送元ファイル名] [転送先S3バケットパス] [s3のプロファイル名]
ですが、
転送元ファイル名
については月によってファイル名が異なるため、ここを可変にするために
オプションの--recursive
--exclude
--include
を使用しました。
オプションの詳細についてはこちら を参照ください。
この3オプションを利用した理由は [aws s3 cp]の引数にはワイルドカードをそのまま使用できないため になります。
※正確にはUNIX スタイルのワイルドカードが使えないです。
UNIXスタイルのワイルドカードの説明についてはこちらを参照ください。
用はexcelの置換等でやる[*.csv]の[*]ような形です。
オプションの使い方
複数のオプションを指定する場合は1番最後のオプションが優先になります。
--recursive
: 指定ディレクトリ・プレフィックス内のすべてのファイル・オブジェクトに対して実行指示を出す
--exclude
: 指定パターンに合致するファイル・フォルダを除く
--include
: 指定パターンに合致するファイル・フォルダのみ残す
注意点
やりながら--include
だけでcsvファイルを選べるのでは?と思ったのですが、
公式によるとデフォルトは「該当フォルダ内のオブジェクトすべて」なので、
特定のものを残したいときは最初に--include
で欲しいオブジェクトを選び、
そのあとに--exclude
で最初に選ばれたオブジェクト以外を除かないと思い通りのものが選ばれない状況になります。
また、--include
のみだとエラーが出るらしいです (参考 ポイント2部分)。
エラーで苦労したところ
引数を変数にし、さらにファイル名をワイルドカードにしたかっただけなのですが
フォルダの引数が先なのか、オプションが先なのかが検索しても出てこずエラーと戦いました。。。
いろんな順でやってみましたが、順番はオプション→フォルダ名 でした。
オプションだけでなく転送したいファイルの指定等も後ろに書かれたものから実行なのかもしれません。
おわりに
同じファイル名で上げられれば良かったのですが、その後の処理都合上やりたくなかったのでいろいろチャレンジしました。
参考になれば幸いです。