シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

ChatGPTに手伝ってもらった話〜ファイルの階層を保持したまま別フォルダへコピーしたい〜

開発課の田畑です。

今回はサイトの修正作業の中でChatGPTに手伝ってもらった話を書きたいと思います。

困ったこと

サイト内で、特定のワードの記載があるファイルのみを抽出し、テキストの変換をかける(例えば「シナプス」というワードが記載されているファイルのみ「電話」を「TEL」へ置き換える)必要が出てきました。 「シナプス」の記載されている場所が「電話」と離れているためVScodeで変換しようとしてもうまくいきませんでした。

悩んでいたところ「コマンドラインを使ったら特定の言葉を含むファイルだけを別フォルダに抽出できると思う。ChatGPTに聞いてみたら?」と同じ課のシステム担当のスタッフにアドバイスをもらったのでやってみることにしました。

ChatGPTとは

Macのターミナルでgit statuscdなどよく使うコマンドならわかりますが、正直なところそれ以外となるとさっぱりです。 でもChatGPTならどうにか教えてくれそうと言うことで、チャレンジしてみることにしました。 ChatGPTについては以下をご覧ください。

ja.wikipedia.org

ChatGPT公式サイトはこちらです。 ChatGPTの始め方は簡単で、公式サイトでアカウントを作成し、ログインすれば使用可能となります。 以下のサイトにアクセスし、「TRY CHATGPT」からログイン画面に移行します。アカウントがない場合は「Sign up」することで登録できますので試してみてください。

openai.com

ChatGPTに「〇〇のやり方を教えて」と書き込むとあっという間に返信が返ってきます。 今回はコマンドラインについての質問ですが、例えば「牛肉とニンニクを使ったレシピを教えて」「部屋の片づけ方」など何でも答えてくれます。 スマートフォンアプリでも利用することができるので、いつでも利用できます。

とても便利なのですが、「情報が正しいかどうか」「本当にそうなるか」は実際にやってみないと分からないこと(レシピも作ってみないと美味しいかどうかは不明です)、また2021年10月以降に発生した出来事について聞いても答えが得られません。そして入力したChatGPTとの会話内容はOpenAIによってその内容を利用されることがあるので、個人情報に関わるものは入力しないようにしましょう。

ChatGPTに聞いてみた

まずは聞いてみたら?と教えてもらった内容でChatGPTに聞いてみました。

「MACで、特定のフォルダ配下で、ファイルの中身に「シナプス」が含まれているファイルを、階層維持したまま別フォルダに出力したいです。どうすればいいですか?」

返ってきた答えが以下になります。

find と grep コマンドを使用して、ファイル内に指定の文字列が含まれるかを検索します。以下のコマンドを使用します。

find . -type f -exec grep -l "シナプス" {} + > /path/to/output.txt

(コマンドの説明は省略しています)

上記を試してみましたが、階層が保持されませんでした。

「階層が保持されません。どうすればいいですか」

以下の rsync コマンドを使用して、ファイルの中身に指定の文字列が含まれるファイルを別のフォルダにコピーします。

rsync -av --include="*/" --include="*シナプス*" --exclude="*" ./ /path/to/output_folder/

(コマンドの説明は省略しています)

これもうまくいきませんでした。ファイル名がシナプスという条件になってしまっているようです。

「ファイル名じゃなくてファイルの中身にシナプスです。」

で、回答された内容を試しますが、やはり階層が保持されません。

何度かやりとりを繰り返し、やっと望む答えが表示されました。

以下のコマンドを使うと、指定した言葉が記載されているjspファイルが階層を保持したままコピーされました!

指定のフォルダ内で.jspファイルのみを対象にし、その中から「シナプス」が含まれるファイルを検索して階層を保持したままコピーするには、以下のコマンドを使う

find . -type f -name "*.jsp" -exec grep -q "シナプス" {} \; -exec rsync -R {} /path/to/output_folder/ \;

このコマンドの説明:
・-name “*.jsp” オプションを使用して、.jsp拡張子を持つファイルのみを対象にします。
・find コマンドはファイルを検索し、grep コマンドで特定の文字列を探します。
・-type f オプションはファイルのみを対象とすることを指定します。
・-exec grep -q "シナプス" {} \; はファイル内に「シナプス」が含まれるかどうかを検索するコマンドです。該当するファイルが見つかった場合、そのファイルが次の -exec コマンドに渡されます。
・-exec rsync -R {} /path/to/output_folder/ \; は、見つかったファイルを rsync コマンドを使って階層を維持したまま /path/to/output_folder/ にコピーするコマンドです。

この方法を使用すると、ファイルの中身に指定の文字列が含まれているファイルを検索し、階層を維持しながら別のフォルダにコピーすることができます。必要に応じてファイルパスや検索条件をカスタマイズしてください。

置き換え方法

  1. さきほどのコマンドを使って、「シナプス」が記載されているファイルのみフォルダ階層を保持したまま別フォルダーにコピー
  2. コピーしたフォルダ内でVSCodeを使って「電話」を「TEL」へ置き換える
  3. 元のフォルダーへ戻して、上書き保存

上記の手順で、「シナプス」が記載されているファイルのみ「電話」を「TEL」へ置き換えることができました。

まとめ

よく分からない分野の場合、自分ではどこが間違っているのか分からないので 「ChatGPTに聞く」&「実際に試す」を繰り返す感じになります。今回の例を踏まえると、繰り返せばいつかゴールにたどり着ける…可能性はそれなりにありそうです。

今回はシステム担当のスタッフにChatGPTへの最初の質問教えてもらった上に、合間で見てもらったので欲しい答えへ到達するのが比較的早かったです。それがなかったらもっと時間かかった上に、回り道をしたと思います。

ChatGPTは自分の知っている分野であればもっと早く答えを導きだせるし、回答の間違いも気付くことができます。自分の場合は、HTMLとCSS関連についてはChatGPTを辞書的な感じで使っています。 また相手が人であれば同じ質問を繰り返すのは気が引けますが、AIなので基本的なことなども何度聞いても大丈夫です。

ChatGPT、とても便利ですので使ったことのない方は是非ためしてみてください。