Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to list directory contents including dotfiles but not . and ..?

How do I get Dir['*'] to include dotfiles, e.g., .gitignore, but not . and ..?

I.e., is there a better way to do:

`ls -A`.split "\n"

perhaps with Dir? The following solutions are close but both include . & ..:

Dir.glob('*', File::FNM_DOTMATCH)
Dir['{.*,*}']

So, the following works:

Dir.glob('*', File::FNM_DOTMATCH) - ['.', '..']

But, is there still a better way to do this?

I'm wondering this to fix line 9 of a Meteor Homebrew Formula.

like image 727
ma11hew28 Avatar asked Jul 08 '12 18:07

ma11hew28


2 Answers

You can't with Dir[], but you can with Dir.glob, which Dir[] calls:

Dir.glob("*", File::FNM_DOTMATCH)

You can get rid of the . & .. easily:

Dir.glob("*", File::FNM_DOTMATCH).tap { |a| a.shift(2) }

But I think it’s probably best to stick with your original way:

Dir.glob("*", File::FNM_DOTMATCH) - %w[. ..]

(among other ways)

However, if you don’t require a more sophisticated glob than *, Dir#children may be all you need (can always further filter/grep the results if more filtering is needed):

Dir.children('.')
like image 200
Andrew Marshall Avatar answered Nov 17 '22 02:11

Andrew Marshall


Here's a shorter version:

Dir['{.[^\.]*,*}']
like image 32
Zubin Avatar answered Nov 17 '22 03:11

Zubin