この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
ちょっとした処理に使うコマンドを書く際に、オプション等を一つ一つ調べながら書くことはあるかと思います。 自分で調べる代わりに、ChatGPTに「お願い」できるかを試してみたいと思い、S3のファイルを検索するコマンドをChatGPTで作ってみました。
以下、自分がChatGPTに入力した内容とChatGPTの回答になります。 自分で調べる代わりとなるかを検証したかったので、入力は口頭での指示に近くなるよう「お願い」形式で入力してみました。 (回答はコマンドと文章を含んでいるため、コマンドの先頭には「$」を追加し、文章は適宜改行しています。)
ChatGPTとのやりとり
最初に以下のようにChatGPTに入力しました。
入力
AWS CLIを使い、S3の「test_bucke」バケットのファイル一覧を取得するコマンドを書いてください。
回答
以下のコマンドで、AWS CLIを使ってS3の「test_bucket」バケットのファイル一覧を取得できます。
$ aws s3 ls s3://test_bucket/
このコマンドは、AWS CLIのs3コマンドを使用し、lsサブコマンドを指定してS3バケット内のファイルの一覧を表示するものです。
S3バケットのパスをs3://test_bucket/で指定しています。
解説付きで回答を得ることができました。バケット名を「test_bucke」とスペルミス(最後の「t」が抜けている)しているのですが、そこもChatGPTで補ってくれたようです。
プロファイル名を追加してみる
プロファイル名を追加したいと思い、以下のように入力してみました。
入力
ありがとう。そのコマンドにAWSクレデンシャルのプロファイルを追加してください。プロファイル名は「text_profile」です。
回答
以下のコマンドで、AWS CLIを使ってS3の「test_bucket」バケットのファイル一覧を取得し、
AWSクレデンシャルのプロファイル「test_profile」を使用するように設定できます。
$ aws s3 ls s3://test_bucket/ --profile test_profile
このコマンドは、先ほどのコマンドに--profileオプションを追加して、test_profileプロファイルを使用するように指定しています。
このプロファイルは、AWS CLIのaws configureコマンドを使用して設定することができます。
固定値を変数にしてみる
バケット名やプロファイル名は変数の方が汎用性が高いと思い、これらを変数にするよう入力してみました。
入力
バケット名とプロファイル名を変数にしてください。
回答
以下のように、シェルスクリプトなどのスクリプト言語を使用して、バケット名とプロファイル名を変数にしてコマンドを実行することができます。
$ BUCKET_NAME="test_bucket"
$ PROFILE_NAME="test_profile"
$ aws s3 ls s3://$BUCKET_NAME/ --profile $PROFILE_NAME
このコマンドでは、BUCKET_NAMEとPROFILE_NAMEという変数を定義し、それぞれにバケット名とプロファイル名を設定しています。
そして、$BUCKET_NAMEと$PROFILE_NAMEという変数展開を使って、実際のコマンドを構築しています。
オプションを指定してみる
ここまでChatGPTが出力したコマンドは正しく実行できたのですが、フォルダ内のファイルも表示したいと思いました。そこで以下のように入力してみました。
入力
バケットの中にあるネストしたフォルダやファイルも表示するようにしてください。
回答
以下のように、AWS CLIのs3コマンドに--recursiveオプションを追加して、S3バケット内のネストしたフォルダやファイルも表示するようにできます。
$ aws s3 ls s3://$BUCKET_NAME/ --profile $PROFILE_NAME --recursive
このコマンドでは、先ほどのコマンドに--recursiveオプションを追加して、S3バケット内の全てのネストしたフォルダやファイルを表示するように指定しています。
このオプションを指定することで、指定されたバケット内のすべてのフォルダとファイルが再帰的に探索され、一覧表示されます。
「--recursive」オプションが付き、フォルダ内のファイル等も表示されるようになりました。
ファイルを絞り込んでみる
バケット内にあるファイルは表示できるようになったので、それらの中から「.csv」「.csv.gz」ファイルだけに絞り込むようにしてみました。 ただし最初は「.csv」だけを想定していたのですが、後から「.csv.gz」も追加したので、入力が2回に分かれています。
入力
ありがとう。その中からbashコマンドを使って、csvファイルだけを表示するようにしてください。
回答
以下のように、AWS CLIのs3コマンドとgrepコマンドを組み合わせて、csvファイルのみを表示するようにできます。
$ aws s3 ls s3://$BUCKET_NAME/ --profile $PROFILE_NAME --recursive | grep "\.csv$"
このコマンドでは、まず先ほどのコマンドに--recursiveオプションを追加して、S3バケット内の全てのフォルダとファイルを再帰的に一覧表示します。
そして、パイプ(|)を使ってgrepコマンドに処理を渡します。
grepコマンドは、正規表現の\と.csv$を使って、ファイル名が.csvで終わるファイルのみを選択し、それらのファイルの情報を表示します。
入力
csvファイルの他に、「.csv.gz」ファイルも表示するようにしてください。
回答
以下のように、AWS CLIのs3コマンドとgrepコマンドを組み合わせて、.csvと.csv.gzファイルの両方を表示するようにできます。
$ aws s3 ls s3://$BUCKET_NAME/ --profile $PROFILE_NAME --recursive | grep -E "\.csv$|\.csv\.gz$"
このコマンドでは、まず先ほどのコマンドに--recursiveオプションを追加して、S3バケット内の全てのフォルダとファイルを再帰的に一覧表示します。
そして、パイプ(|)を使ってgrepコマンドに処理を渡します。
grepコマンドの-Eオプションを使って、正規表現の\.csv$と\.csv\.gz$を使って、.csvと.csv.gzの両方のファイルを選択し、それらのファイルの情報を表示します。
ファイルの絞り込みについても回答を得ることができました。ここまで回答として提示されたコマンドを実行してましたが、どれも正しく動作しました。
まとめ
ChatGPTに逐次的に入力していくことで意図したコマンドを得ることができました。コマンドのオプションなどは忘れていることも多いのですが、ChatGPTに「お願い」することでサクッと作れることも多くなってくるように思えます。