GoProのファイル名をリネームするプログラムを、ChatGPTに作ってもらった話
はじめに
GoProの命名規則は本当に不可解。そこで、今まではこのサイトを参考にファイル名を変更していたのだが、PCを新調した関係でWindows11になってしまい、このプログラムが動作しなくなってしまった。
しゃーなし、プログラムを改変するかー、などと思っていたが、ふと思い立ってChatGPTに相談してみたらあっという間に解決したので、記録として残してみることにする。
使えれば顛末などどうでもいいという人は、下記の実際のコード以降の欄を参照してください。
GoProのファイル名
GoProのファイル名は下記の通り。ほんとにプログラマーが書いたのか?こういう命名規則にするインセンティブが本当にわからない。教えて偉い人。
これの何が問題かというと、上記の例の場合の1234番の動画の前半と後半が名前順ソートで遥か彼方に離れ離れになってしまうことだ。
なんで?いやマジでなんで???
ファイル名のリネーム
というわけで整理したいわけだが、当然手動でちまちま作業などできない。仕事でプログラミングもしている者のはしくれとして、こんなことは人間のすることではない、と以前ググったところ、下のようなサイトをみつけた。
非常にありがたい。というわけでしばらく活用させていただいていたのだが、移住に伴いパソコンを新調し否応なくWindows11になったことで、このプログラムが動作しなくなってしまった。
やむなく自分でスクリプトを書こうかと思ったのだが、LE0はVBScriptがわからぬ。LE0は一回の研究者である。ダウンロードした、他人のコードでやり過ごしてきた。
まずはVBScriptを調べようかと思ったところで、GoogleではなくChatGPTにアクセスすることを思いついた。しかもどうせ聞くなら、コードの読み方ではなく、使えるコードを聞いてしまおう。ということで質問してみた。
ChatGPT大先生
いかにやり取りの一部を引用する。実際に使える形になったコードは最後に公開する。なおChatGPTは無課金である。ので、現時点 (2023年5月末) では3.5である。
LE0「下記のコードがWindows10では動くのにWindows11では動きません。どのように修正すればよいか教えてください。(コード貼り付け)」
というわけで言われた通り実行してみたものの、エラーを吐いた。エラーコードを何度か送り付けて修正させたが、同様のエラーを吐き続けている。ChatGPTいわく文字コードの問題のようなので、そもそも日本語が入っているのが原因かも?と思い下記のように依頼した。
LE0「日本語部分を英訳して代替コードを作成してください。」
これで晴れて動くコードが完成した (実際はファイルの指定などでもう少し調整があったが)。
実際のコード
変換用 (Rename.ps1)
$TITLE = "GoPro Video Renamer"
function Convert-Name {
param(
[string]$Path,
[switch]$DoRename
)
$folder = Get-Item $Path
if ($folder -is [System.IO.DirectoryInfo]) {
$files = Get-ChildItem -Path $folder.FullName -File
}
else {
Write-Host "Invalid folder path." -ForegroundColor Red
return
}
foreach ($file in $files) {
$parentFolderName = $file.DirectoryName
$fileName = $file.Name
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName)
$extensionName = [System.IO.Path]::GetExtension($file.FullName)
$regexPattern = "(G.)(\d{2})(\d{4})"
if ($baseName -match $regexPattern) {
$afterFileName = [regex]::Replace($baseName, $regexPattern, '$1$3-$2') + $extensionName # Renamed file name
if ($DoRename) {
Rename-Item $file.FullName -NewName $afterFileName -Force # Execute rename
}
Write-Host "$fileName → $afterFileName" -ForegroundColor Green # Display result
}
else {
Write-Host "$fileName → Not applicable." -ForegroundColor Red # Display result
}
}
}
$folderPath = Read-Host "Enter the folder path:"
if (-not (Test-Path $folderPath)) {
Write-Host "Invalid folder path." -ForegroundColor Red
exit
}
Convert-Name -Path $folderPath
$res = Read-Host "`nRename the files as shown above. Do you want to proceed? (Y/N)"
if ($res.ToUpper() -eq "Y") {
Convert-Name -Path $folderPath -DoRename
Write-Host "`nThe files have been renamed as shown above." -ForegroundColor Cyan
}
else {
Write-Host "Operation cancelled." -ForegroundColor Yellow
}
逆変換 (ReverseRename.ps1)
$TITLE = "GoPro Video Reverse Renamer"
function Convert-Name {
param(
[string]$Path,
[switch]$DoRename
)
$folder = Get-Item $Path
if ($folder -is [System.IO.DirectoryInfo]) {
$files = Get-ChildItem -Path $folder.FullName -File
}
else {
Write-Host "Invalid folder path." -ForegroundColor Red
return
}
foreach ($file in $files) {
$parentFolderName = $file.DirectoryName
$fileName = $file.Name
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName)
$extensionName = [System.IO.Path]::GetExtension($file.FullName)
$regexPattern = "(G.)(\d{4})-(\d{2})"
if ($baseName -match $regexPattern) {
$afterFileName = [regex]::Replace($baseName, $regexPattern, '$1$3$2') + $extensionName # Renamed file name
if ($DoRename) {
Rename-Item $file.FullName -NewName $afterFileName -Force # Execute rename
}
Write-Host "$fileName → $afterFileName" -ForegroundColor Green # Display result
}
else {
Write-Host "$fileName → Not applicable." -ForegroundColor Red # Display result
}
}
}
$folderPath = Read-Host "Enter the folder path:"
if (-not (Test-Path $folderPath)) {
Write-Host "Invalid folder path." -ForegroundColor Red
exit
}
Convert-Name -Path $folderPath
$res = Read-Host "`nRename the files as shown above. Do you want to proceed? (Y/N)"
if ($res.ToUpper() -eq "Y") {
Convert-Name -Path $folderPath -DoRename
Write-Host "`nThe files have been renamed as shown above." -ForegroundColor Cyan
}
else {
Write-Host "Operation cancelled." -ForegroundColor Yellow
}
使用方法
上記のコードそれぞれに適当な名前を付けて適当な場所に保存する。拡張子は.ps1とする。
右クリックし、"power shellで実行" する。
ファイルパスを求められるので、入力してEnter。フォルダを入力すると、フォルダ内のすべてのファイルを一括で変更できる。
変更されるファイルの名前と変更後の名前の一覧が表示されるので、確認し、yで実行する。
まとめ
というわけで、Power Shellなどほとんど触ったことのない私でも、簡単にリネームソフトを作ることができた。ChatGPTさまさまである。
やはり今の時代、求められているのは細かい実務ではなく、AIを活用できる素養なのだろう。昨今のAI論に関してもいろいろと思うところはあるが、これについてはいずれ別記事に書く…かもしれない。
本文は以上ですが、例によって募金用の課金枠を用意しておきますので、参考になったので応援したいという奇特な方はどうぞよろしくお願いいたします。
ここから先は
この記事が気に入ったらサポートをしてみませんか?