This blog is part of our Ruby 2.5 series.

Dir.entries is a method present in Ruby 2.4. It returns the output of shell command ls -a in an array.

> Dir . entries ( "/Users/john/Desktop/test" ) => [ "." , ".." , ".config" , "program.rb" , "group.txt" ]

We also have method Dir.foreach which iterates and yields each value from the output of ls -a command to the block.

> Dir . foreach ( "/Users/john/Desktop/test" ) { | child | puts child } . . . . config program . rb group . txt test2

We can see that the output includes the directives for current directory and parent directory which are "." and ".." .

When we want to have access only to the children files and directories, we do not need the [".", ".."] subarray.

This is a very common use case and we’ll probably have to do something like Dir.entries(path) - [".", ".."] to achieve the desired output.

To overcome such issues, Ruby 2.5 introduced Dir.children. It returns the output of ls -a command without the directives for current and parent directories.

> Dir . children ( "/Users/mohitnatoo/Desktop/test" ) => [ ".config" , "program.rb" , "group.txt" ]

Additionally, we can use Dir.each_child method to avoid yielding current and parent directory directives while iterating,

> Dir . each_child ( "/Users/mohitnatoo/Desktop/test" ) { | child | puts child } . config program . rb group . txt test2

As noted in the discussion the names were chosen to match with existing methods Pathname#children and Pathname#each_child.

These additions seem like simple features. Well the issue was posted more than two years ago.