# Search latest version of file in directory

**URL:** <https://www.ruby-forum.com/t/search-latest-version-of-file-in-directory/159895>\
**Category:** Ruby\
**Created:** [February 9, 2009, 8:47pm UTC](https://www.ruby-forum.com/t/search-latest-version-of-file-in-directory/159895 "2009-02-09T20:47:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![mmcolli00](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@mmcolli00](https://www.ruby-forum.com/u/mmcolli00)\
**Post date:** [February 9, 2009, 8:47pm UTC](https://www.ruby-forum.com/t/search-latest-version-of-file-in-directory/159895/1 "2009-02-09T20:47:24Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mmcolli00](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@mmcolli00](https://www.ruby-forum.com/u/mmcolli00)\
**Post date:** [February 9, 2009, 9:55pm UTC](https://www.ruby-forum.com/t/search-latest-version-of-file-in-directory/159895/2 "2009-02-09T21:55:46Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mmcolli00](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@mmcolli00](https://www.ruby-forum.com/u/mmcolli00)\
**Post date:** [February 10, 2009, 9:50am UTC](https://www.ruby-forum.com/t/search-latest-version-of-file-in-directory/159895/3 "2009-02-10T09:50:18Z")

</div>

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
