optparse が使いやすすぎるので調子に乗って mkdir 書いてみた

エンコードがアレだけど、書いてみた。
--mode 実装してないけどね!

#!c:/bin/ruby/bin/ruby
# -*- encoding: shift_jis -*-
# mkdir.rb

require 'optparse'

Encoding.default_external = Encoding::Shift_JIS
Encoding.default_internal = Encoding::Shift_JIS

opt             = OptionParser.new
OPT             = {}
PROGRAM_NAME    = File.basename( $0, ".*" )

opt.on( "-m MODE", "--mode=MODE", "ディレクトリのモードを設定します。" ) do |mode|
  OPT[:mode]    = mode
end

opt.on( "-p", "--parents", "指定したディレクトリをサブディレクトリごと作成します。" ) do |parents|
  OPT[:parents] = parents
end

opt.on( "-v", "--verbose", "ディレクトリを作成するごとに標準出力に表示します。" ) do |verbose|
  OPT[:verbose] = verbose
end

opt.parse!( ARGV )


def directory_already_exists(path)
  $stderr.puts "#{PROGRAM_NAME}: ディレクトリを作成できませんでした。 `#{path}' はすでに存在します。"
end


def such_directory_not_exists(path)
  $stderr.puts "#{PROGRAM_NAME}: ディレクトリを作成できませんでした。 `#{path}' のようなファイルまたはディレクトリは存在しません。"

  exit
end


def on_error_when_creating(path, err)
  p err
  begin
    message = err.message.encode( 'shift_jis' )
  rescue
    $stderr.puts "#{PROGRAM_NAME}: `#{path}' の作成に失敗しました。"
  else
    $stderr.puts "#{PROGRAM_NAME}: #{err} `#{path}' の作成に失敗しました。"
  end
  
end


def on_created(path)
  $stdout.puts "#{PROGRAM_NAME}: ディレクトリを作成しました。 `#{path}'" if OPT.has_key? :verbose
end


def create_directory(path, element)
  path.encode!( 'shift_jis' )
  begin
    Dir.mkdir path
  rescue => e
    on_error_when_creating element, e
  else
    on_created element
  end
end


ARGV.each do |element|
  fullpath  = File.expand_path( element )

  if File.exists? fullpath then
    directory_already_exists element
  end

  dirs      = fullpath.split( /\// )
  currents  = Dir.pwd.split( /\// )
  bases     = dirs & currents

  dirs      = dirs - bases
  base_path = bases.join( '/' )
  if dirs.length == 1 then
    create_directory "#{base_path}/#{dirs.first}", element
  else
    if OPT.has_key? :parents then
      make_path   = "#{base_path}/"
      dirs.each do |dir|
        make_path += "#{dir}/"
        create_directory( make_path, element ) unless File.exists? make_path
      end
    else
      such_directory_not_exists element
    end
  end
end