Ruby の Thor でコマンドを作る

Ruby でコマンドを作る。Gem 'Thor' を使う。

まず
$ gem install thor
をする。Bundler を使うと bundle exec が必要になってしまうので、gem install の方がよい。

greeting

#!/usr/bin/env ruby
require 'thor'

class Greeting < Thor
  default_command :hello

  desc 'hello', 'Say hello.'
  def hello
    puts `whoami`
  end
end

Greeting.start

シェバング行は必要。

パスが通っているところにコピー。
$ chmod a+x greeting
$ sudo cp greeting /usr/local/bin

実行。

$ greeting
tomoki


※参考
thor Rubyで簡単にshellコマンドが作れる! | 酒と涙とRubyとRailsと
Cloud Automator | Thorを使ってコマンドラインツールを作る
Thorで簡単にコマンドラインアプリをつくる - Hibariya
Thorの使い方まとめ

delete_empty_folder

カレントディレクトリ内の空フォルダをすべて削除する。
$ delete_empty_folder
指定したフォルダ内で実行する。
$ delete_empty_folder delete [directory_name]

#!/usr/bin/env ruby
require 'thor'

class DeleteEmptyFolder < Thor
  default_command :delete

  desc 'delete', 'delete empty folder in given directory'
  def delete(f_name = nil)
    f_name = Dir.pwd unless f_name
    Dir.chdir(f_name)
    Dir.glob("*").each do |name|
      next unless File.directory?(name)
      Dir.rmdir(p name) if Dir.glob("./#{name}/*").empty? rescue next
    end
  end
end

DeleteEmptyFolder.start

renumber

$ renumber bytime num [directory_name]
"new_folder" ディレクトリを作り、その中へ画像ファイルを更新時間順にコピーする。ファイル名は時間順に4桁の数字(開始は num でこの引数は必須)で順に名付けられる。コピーされる画像ファイルの入っているディレクトリ名を指定することもできる。

#!/usr/bin/env ruby
require 'bundler/setup'
require 'fileutils'
require 'thor'
require 'utils'

class Renumber < Thor
  desc 'bytime', "Renumber by file time."
  def bytime(num, f_name = nil)
    num = num.to_i
    raise "Wrong Argument." if num.zero?
    f_name = Dir.pwd unless f_name
    Dir.chdir(f_name)
    name = Dir.glob("*")
    Dir.mkdir("new_folder")
    
    tm = []
    name.each {|n| tm << File.stat(n).mtime}
    f = name.zip(tm)
    f.sort! {|a, b| a[1] <=> b[1]}
    f.each do |name|
      na = ("new_folder/%04d" % num) + name[0].imgsuffix
      FileUtils.cp(name[0], na)
      num += 1
    end
  end
end

Renumber.start

dlfiles

[folder_name] ディレクトリ(省略可)内の画像ファイルでないファイルをすべて削除する。
$ dlfiles nonimg [folder_name]
 

#!/usr/bin/env ruby
require 'thor'
require 'utils'

class Dlfiles < Thor
  desc 'nonimg', 'Delete files which are not image files.'
  def nonimg(fname = nil)
    fname = Dir.pwd unless fname
    Dir.chdir(fname)
    Dir.glob("*").sort.each do |f|
      next if File.directory?(f)
      a = nil
      if f.imgsuffix.empty?
        until a == "y" or a == "n"
          print "#{f}: Not image suffix: Do you want to delete? (y/n):"
          puts a = Utils.key_wait
        end
      end
      next if a == "n"
      puts "delete: #{f}" if Utils.delete_non_img(f)
    end
  end
end

Dlfiles.start