如何在目录中获取最后修改的文件以使用Ruby传递给系统命令?

时间:2012-12-05 20:47:23

标签: ruby

我正在尝试做一些开发。我需要抓取目录中的最后一个修改过的文件,将文件名传递给另一个命令。

如果我在Ruby中输出了ls -la的文件列表:

-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扫描并拉出最后一个文件?

这样的事情是否可能?

1 个答案:

答案 0 :(得分:3)

没有必要向ls发送shell并解析其输出。 Ruby为您提供标准库方法来获取目录内容并检查文件mtimes。这是一个ruby方法,用于返回具有最新mtime的目录中文件的名称。

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