Forum: Ruby search latest version of file in directory

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mmcolli00 M. (Guest)
on 2009-02-09 21:47
Hi, I have a directory full of files and want to get the newest version
of each out of the directory. The files look like below. Please tell me
if you know a way to pull out the latest version of each. Thanks

34_web1_no2_09202008.txt
34_web1_no2_09212008.txt <--want to pull out this latest version
34_web2_no3_10122008.txt
34_web2_no3_10132008.txt <--want to pull out this latest version

******snippet*******************************************

newsortfile = Dir["C:/Status2/*.html"].map{|@f|
[@f,File.mtime(@f)]}.sort_by{|@i|@i[1]}
@NewestFile = @i[1]

Dir.entries("C:/Status2/").each do |filename|
  if File.mtime("C:/Status2/"+filename) == @NewestFile then
    puts filename
   end
 end
Robert K. (Guest)
on 2009-02-09 22:55
(Received via mailing list)
On 09.02.2009 20:46, Mmcolli00 Mom wrote:
>
> newsortfile = Dir["C:/Status2/*.html"].map{|@f|
> [@f,File.mtime(@f)]}.sort_by{|@i|@i[1]}
> @NewestFile = @i[1]
>
> Dir.entries("C:/Status2/").each do |filename|
>   if File.mtime("C:/Status2/"+filename) == @NewestFile then
>     puts filename
>    end
>  end

This is how I'd approach this:

dir = "C:/Status2"
files = Hash.new {|h,k| h[k] = []}

Dir[File.join(dir, "*.txt")].each do |f|
   files[f[/^\d+_web\d+_no\d+/]] << File.join(dir, f)
end

files.each do |k,v|
   puts v.sort_by! {|f| File.mtime(f)}.last
end

Cheers

  robert
William J. (Guest)
on 2009-02-10 10:50
(Received via mailing list)
Mmcolli00 Mom wrote:

> ******snippet*******************************************
>
> newsortfile = Dir["C:/Status2/*.html"].map{|@f|
> [@f,File.mtime(@f)]}.sort_by{|@i|@i[1]}
> @NewestFile = @i[1]
>
> Dir.entries("C:/Status2/").each do |filename|
>   if File.mtime("C:/Status2/"+filename) == @NewestFile then
>     puts filename
>    end
>  end

rx = /^.*_no\d+/
puts DATA.readlines.sort_by{|x| [x[rx],x[-8,8],x] }.
  inject(nil){|prev,x|
    puts prev if prev && prev[ rx ] != x[ rx ] ; x }

__END__
34_web1_no2_12202007.txt
34_web1_no2_09202008.txt
34_web1_no2_09212008.txt
34_web2_no3_12122007.txt
34_web2_no3_10122008.txt
34_web2_no3_10132008.txt
This topic is locked and can not be replied to.