OneDrive連携でスクショ画像用のRubyスクリプト書いた

昨日に引き続いてRubyスクリプト実践してみる第2弾!

普段Windowsでスクショすると、OneDriveの画像フォルダに自動で保存されるように設定してメモ代わりにしてるんですが、この自動保存、連番が時系列順にならないという謎仕様。

f:id:a3t3mbk:20180915220401p:plain

ほかのフォルダとかを名前順で表示していると、先(16:21にとってるやつ)が下にきて、あと(16:22のやつ)が上に来てしまう。 詳細の時系列順でソートすると、フォルダとかの並びが普段と変わってちょっと面倒、ということで、ファイル名を変更するスクリプト書いてみました。

require 'fileutils'

begin

Dir::glob("*\.png").each do |filename|
        if filename =~ /[ ]/ then
                newfilename = filename.gsub(/[ ]\(([0-9]+)\)/, "dummy")
                newfilename = newfilename.gsub(/dummy/, '-' + $1)
                File.rename(filename, newfilename)
        end
end
rescue => error
        puts error # 変数の値を表示
        gets # エラー確認してキー入力でコンソールを抜ける
end

これでカッコが取り除かれてハイフンになって、名前順と時間順が一致します!下記は実行後の例です! f:id:a3t3mbk:20180915221005p:plain

しかしここまでが難航!

最初はifとかエラーレスキューとかなかったんですが、ifがないと、別のファイル(名前を変える必要がないファイル)でgsubの不一致でエラーが返ってきてしまい、スクリプトが停止してしまうという!

対象のファイルだけ処理する必要があることに気付くのに数時間かかった…初心者はツライ…しかも数時間かけてdummyを回避する方法が分からないという

仕方がないのでGoogle先生に質問!参考サイトとして

qiita.com を発見する。この方の本文では動かないコードが書いてあるんですが、コメントが参考になりました!

gsubの第2引数に$1が使えないのは、正規表現が戻り値をまだ出していないからで、ブロックを後ろに着けると動くとのこと、書いてみると、下記

require 'fileutils'

begin

Dir::glob("*\.png").each do |filename|
        if filename =~ /\s/ then
                newfilename = filename.gsub(/\s\((\d+)\)/) {'-' + $1}
                File.rename(filename, newfilename)
        end
end
rescue => error
        puts error # 変数の値を表示
        gets # エラー確認してキー入力でコンソールを抜ける
end

で、確かに動く!

でも論理的には理解不能だ…なぜこれで置換されるのか意味不。orz