Hatena::Grouprubyist

Ruby初心者prinyの学習帳 RSSフィード

2009-02-05練習: Unix の 「ls -t」 コマンドのようなメソッド

『たのしいRuby』の第 17 章(Time クラス)の練習問題(2)

Unixの「ls -t」コマンドのように、ディレクトリを指定すると、そのディレクトリの下にある
ファイルを時刻の順に並べるメソッド ls_t を定義しましょう。
このメソッドは引数を1つだけ取ります。

 ls -t(調べるディレクトリ名)

指定されたディレクトリの下にあるファイルの名前を、その時刻の古い順に並べて表示します。

これだけだと、ファイルの名前だけ表示すればいいのか、それとも、時刻も表示するのかなど、仕様が決められないので、Unixls コマンドの t オプションについて調べた。
そしたら、UNIXコマンド [ls]では、t オプションをつけると、最新更新日時の最新のものから順に表示する、と説明されていた。
それで、Linux で実際に「ls -t」コマンドを使ってみたら、更新日時が新しいものが上にきていた。更新日時は表示されず、ファイル名だけが表示された。

実際に使ってみたときの結果から、以下のようなものをつくることにする。

  • ディレクトリを指定すると、そのディレクトリの下にあるファイルの名前を、更新日時の新しいものから表示する
  • 更新日時は表示しない
  • 隠しファイル(ファイル名が . (ピリオド) で始まるもの)は表示しない

書いたもの

def ls_t(dir)
  entries = []
  Dir.foreach(dir) {|path|
    next if  /^\./ =~ path
    modified_time = File.mtime(File.join(dir, path))
    entries << [path, modified_time]
  }
  
  entries.sort!{|a, b|
    b[1] <=> a[1]
  }.each{|entry|
   puts entry[0]
  }
end

ls_t(ARGV[0])

フォルダを「更新日時」で並べ替えたときと同じ並び順になったし、隠しファイルは表示されなかった。つくろうろしたものはできた、と思う。

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/priny/20090205