Edited at
移行Day 15

AdventCalendar Day15 [超Ruby入門]


はじめに

Day15では、lsコマンドを実装する。


目的

lsコマンドを実装することで、DirとFileクラスに対する理解を深める。


目標

自分で選んだオプションを既存コードに組み込みことができる。


準備


lsコマンド

$man 1 ls


For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information.

For each operand that names a file of type directory, ls displays the names of files contained within that directory, as well as any

requested, associated information.

-S Sort files by size

-r Reverse the order of the sort to get reverse lexicographical order or the oldest entries first (or largest files last, if combined with sort by size


lsコマンドは、ファイルやディレクトリの情報を表示するコマンドです。

様々なオプションを指定できるが、今回はファイルサイズでソートする-Sと並びを反転させる-rのみを組み込む。


本題

まず、ls.rbと同じディレクトリで以下のコマンドを実行しよう。

$mkdir dir_ls

$touch file_ls
$touch .secret
$ls -al

実装はclass Dirclass Filelibrary optparseを理解すれば簡単だ。

以下のコードを実行すれば、lsコマンドと同じ挙動になるのだが、今回は愚直にプログラムを組んだ。

Dir.glob("*")

実際のコードを以下に示す。


ls.rb

class Ls

def initialize(option, current_path)
@current_path = current_path
@directorys = []
@files = []

Dir.children(@current_path).each { |item| @directorys << item if File.directory?(item) }
Dir.children(@current_path).each { |item| @files << item if File.file?(item) }

@puts_info = @directorys + @files

exec_option(option)
end

def show()
@puts_info.each do |info|
puts "File_name: #{info} size: #{File.size(info)}"
end
end

private

def exec_option(option)
if option.has_key?(:S)
exec_S
end

if option.has_key?(:r)
exec_r
end
end

def exec_S
@puts_info.sort! { | a, b | File.size(b) <=> File.size(a) }
end

def exec_r
@puts_info.reverse!
end

end

require 'optparse'

option = {}
OptionParser.new do |opt|
opt.on("-r", "", "Reverse the order of the sort to get reverse
lexicographical order or the oldest entries first"
) { |v| option[:r] = v }
opt.on("-S", "", "Sort files by size" ) { |v| option[:S] = v }
opt.parse!(ARGV)
end

myls = Ls.new(option, Dir.pwd)
myls.show()



UFO演算子

@puts_info.sort! { | a, b | File.size(b) <=> File.size(a) }

<=>は、UFO演算子と呼ばれている。

x <=> y は以下の規則に従って評価を行う。


  • x が y より大きいなら正の整数

  • x と y が等しいなら 0

  • x が y より小さいなら負の整数

  • x と y が比較できない場合は nil


課題

サンプルコードを参考に本来のlsコマンドに近づける。

ex.


  • 正規表現を利用できるようにする。

  • 指定したディレクトリの情報を取得できるようにする。


もっと深めたい

今まで使ったことのあるUnixコマンドと使ったことのないUnixコマンドをRubyで実装せよ。