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