#author("2018-08-30T09:37:26+09:00","default:yakumo_murakami","yakumo_murakami")
[[Ruby]]

テキストでもそうなんだけど、「12月23日・メモ.xlsx」みたいに頭に日付つけたファイルを定期的に作って作業する事があるのよね。いちいちコピーしてたんだけど、めんどい。

そんなわけで、勝手に新しい日付をナンバリングして複写してみた。

* neo.rb(2018/8/30) [#l2fa2559]

 #!/usr/bin/ruby -EUTF-8
 
 require 'date'
 require 'fileutils'
 
 class String
  def _newest(nn)
    file = nil
    if nn == false
      file = Dir.glob("*.#{self}").sort_by {|f| File.mtime(f)}.reverse[0]
    else
      Dir.glob("*.#{self}").sort_by {|f| File.mtime(f)}.reverse.each{|fn|
        if fn =~ /^\d/
          file = fn.clone
          break
        end
      }
    end
    file
  end
  def _getDate
    fn = self
    yd = Date.today.strftime("%Y")
    d = fn.gsub(/^(\d{1,9})月(\d{1,2})日.+$/,"#{yd}/\\1/\\2")
    d1 = DateTime.parse(d)
    fn2 = fn.clone
    if d =~ /^\d+\/\d+\/\d+$/
      begin
        d3 = Date.today.strftime("%m月%d日")
        fn2 = fn.gsub(/^(\d{1,9})月(\d{1,2})日(.+)$/,"#{d3}\\3")
      rescue => ee
        p ee
      end
    else
      p "フォーマットが対応外(先頭にn月d日が入ってない)。"
    end
    fn2
  end
  def _cpy_today
    fn = self._newest(true)
    fn2 = fn._getDate
    if fn != fn2 && File.exist?(fn2) == false
      print "#{fn} => #{fn2} ... "
      #FileUtils.cp(fn,fn2,{:preserve => true})
      FileUtils.cp(fn,fn2)
      print "Done.\n"
    end
  end
 end
 
 prm = "xlsx"
 
 ARGV.each{|x|
  prm = x.clone if x =~ /^[a-z0-9]+$/
 }
 
 prm._cpy_today


うん。

** 使い方 [#q4efb835]

パスの通ったところに設置し、コンソールで作業したいディレクトリに移動して、このスクリプトを呼び出せばOK。

** 注意点 [#bcb2f963]

- 動作検証はcygwin(64)でやりました。
- 最も新しいタイムスタンプのファイルを探し、ファイル名の先頭の日付を書き換えます。
- 今日の日付の入ったファイルがもうある時は何もしない。
- 年が入ってないしゼロサプレスもしてないけど、そこはお好みで。
- ''最初に日付の入っている最新ファイル'' を探し、それをもとにコピーする。 
-- 日付が最初にあるファイルが存在しない場合、その旨を表示して終了。
-- 日付は「8月30日」形式が基本。
- デフォルトでは*.xlsxを対象としているが、変更したい時は最終パラメータに拡張子をいれて。たとえば以下のように。

 $ ruby neo.rb txt

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS