# List of directory

**URL:** <https://www.ruby-forum.com/t/list-of-directory/110448>\
**Category:** Ruby\
**Created:** [July 26, 2007, 12:54pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448 "2007-07-26T12:54:58Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sirtyman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@sirtyman](https://www.ruby-forum.com/u/sirtyman)\
**Post date:** [July 26, 2007, 12:54pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448/1 "2007-07-26T12:54:58Z")

</div>

Hi,

Does anybody know how to list directory in alphabetical order? i.e.  
I have following files:  
a10  
a1  
a2  
a20

sort method sorts them as follows:

a1  
a10  
a2  
a20

but I need such order:

a1  
a2  
a10  
a20

Any help would be helpful.  
Thanks in advance

---

<div class="post-metadata">

**Author:** ![sirtyman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@sirtyman](https://www.ruby-forum.com/u/sirtyman)\
**Post date:** [July 26, 2007, 1:03pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448/2 "2007-07-26T13:03:29Z")

</div>

2007/7/26, Marcin T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> a20  
> Apparently you want to _sort by_ the numeric part. You can extract it  
> with a regular expression like this:

irb(main):017:0\> a.sort\_by {|x| x[/\d+/].to\_i }  
=\> [“a1”, “a2”, “a10”, “a20”]

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![sirtyman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@sirtyman](https://www.ruby-forum.com/u/sirtyman)\
**Post date:** [July 26, 2007, 1:07pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448/3 "2007-07-26T13:07:31Z")

</div>

Robert K. wrote:

> 2007/7/26, Marcin T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > a20  
> > Apparently you want to _sort by_ the numeric part. You can extract it  
> > with a regular expression like this:
> 
> irb(main):017:0\> a.sort\_by {|x| x[/\d+/].to\_i }  
> =\> [“a1”, “a2”, “a10”, “a20”]
> 
> Kind regards
> 
> robert

I’ve done it as follows:

arrOfFiles.sort! do |file1, file2|

f1 = file1.slice(/\d+.sql/)  
f1 = f1.slice(/\d+/)

f2 = file2.slice(/\d+.sql/)  
f2 = f2.slice(/\d+/)

f1.to\_i \<=\> f2.to\_i  
end

Thanks Robert

---

<div class="post-metadata">

**Author:** ![sirtyman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@sirtyman](https://www.ruby-forum.com/u/sirtyman)\
**Post date:** [July 26, 2007, 1:22pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448/4 "2007-07-26T13:22:32Z")

</div>

2007/7/26, Marcin T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > Kind regards
> 
> f2 = file2.slice(/\d+.sql/)  
> f2 = f2.slice(/\d+/)
> 
> f1.to\_i \<=\> f2.to\_i  
> end

Well, if you want to sort in place you could do

irb(main):003:0\> %w{a10 a1 a2 a20}.sort! {|\*a| a.map{|x|  
x[/\d+/].to\_i}.inject {|a,b| a\<=\>b}}  
=\> [“a1”, “a2”, “a10”, “a20”]

Um, not very readably I guess.

:-)))

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![sirtyman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@sirtyman](https://www.ruby-forum.com/u/sirtyman)\
**Post date:** [July 26, 2007, 11:41pm UTC](https://www.ruby-forum.com/t/list-of-directory/110448/5 "2007-07-26T23:41:38Z")

</div>

On Jul 26, 4:54 am, Marcin T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> a10  
> a2  
> a20
> 
> but I need such order:
> 
> a1  
> a2  
> a10  
> a20

files = %w| a1 ab1a ab1b ac1 a2 ab2 ab3 b1 bb1 ba1 a10 a20 a10a a aa  
ab ac |  
puts files.sort\_by{ |f|  
f.split( /(\d+)/ ).map{ |piece|  
Integer(piece) rescue piece  
}  
}

#=\> a  
#=\> a1  
#=\> a2  
#=\> a10  
#=\> a10a  
#=\> a20  
#=\> aa  
#=\> ab  
#=\> ab1a  
#=\> ab1b  
#=\> ab2  
#=\> ab3  
#=\> ac  
#=\> ac1  
#=\> b1  
#=\> ba1  
#=\> bb1
