-1

私はいくつかの開発作業を行おうとしています。ファイル名を別のコマンドに渡すには、ディレクトリ内の最後に変更されたファイルを取得する必要があります。

ls -laRubyで出力されたファイルのリストがある場合:

-rw-r--r--  1  163929215 2012-11-26 00:02 appname_20121126_000002.tgz
-rw-r--r--  1  164051752 2012-11-27 00:02 appname_20121127_000002.tgz
-rw-r--r--  1  164160113 2012-11-28 00:02 appname_20121128_000002.tgz
-rw-r--r--  1  164284597 2012-11-29 00:02 appname_20121129_000004.tgz
-rw-r--r--  1  164342795 2012-11-30 00:02 appname_20121130_000003.tgz
-rw-r--r--  1  164448312 2012-12-01 00:02 appname_20121201_000003.tgz
-rw-r--r--  1  164490727 2012-12-02 00:02 appname_20121202_000002.tgz
-rw-r--r--  1  164546124 2012-12-03 00:02 appname_20121203_000001.tgz
-rw-r--r--  1  164594711 2012-12-04 00:02 appname_20121204_000002.tgz

これをRubyでスキャンして、最後のファイルをプルするにはどうすればよいですか?

このようなことも可能ですか?

4

1 に答える 1

4

出力をシェルアウトしlsて解析する必要はまったくありません。Rubyには、ディレクトリの内容をフェッチしてファイルをmtimes調べるための標準ライブラリメソッドが用意されています。これは、最新のmtimeを持つディレクトリ内のファイルの名前を返すrubyメソッドです。

def last_modified_in dir
  Dir.glob( File.join( dir,'*' ) ).
  select  {|f| File.file? f }.
  sort_by {|f| File.mtime f }.
  last
end

irb> system 'mkdir -p /tmp/foo'
irb> system 'rm /tmp/foo/*'
irb> ('a'..'c').each { |f| system "touch /tmp/foo/#{f}"; sleep 1; }
irb> puts last_modified_in '/tmp/foo'
# => /tmp/foo/c
于 2012-12-05T21:41:33.090 に答える